У меня есть какая-то библиотека, для которой я пишу оболочку, и затем я пытаюсь сгенерировать оболочку SWIG, чтобы я мог делать вызовы прямо из Java.
Я столкнулся с проблемой, которую не могу отладитьтак как есть в основном 0 информации (сторона Java).Вот с чем я имею дело.У меня есть собственный класс, подобный этому:
class APIClass {
private:
public:
APIClass();
void mbstowcsTest();
};
И его реализация выглядит следующим образом
typedef unsigned short AName[32];
void APIClass::mbstowcsTest() {
const char* source = "D:\\test3\\source\\test.txt";
AName tmp1;
mbstowcs((wchar_t*)tmp1, source, 32 - 1);
}
С помощью такого кода я генерирую SWIG-файлы для него и компилирую код с помощью пакетного скриптавот так:
@echo off
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x64
swig -c++ -java -outdir java api.i
set CompilerFlags=-nologo -Zi
pushd build
cl %CompilerFlags% ..\api.cpp ..\api_wrap.cxx /I"C:\Program Files (x86)\Java\openjdk8u102-win_jdk\include"^
/I"C:\Program Files (x86)\Java\openjdk8u102-win_jdk\include\win32" /LD /EHsc
popd
COPY .\build\api.dll .\java\
Что касается файла интерфейса api.i, то это всего лишь:
%module api
%{
#include "api.h"
%}
%include "api.h"
В принципе, если я вызываю APIClass::mbstowcsTest()
в главной функции C ++, все идет хорошои mbstowcs()
проходит без проблем, вот так:
APIClass *api = NULL;
api = new APIClass();
api->mbstowcsTest();
В то время как на стороне Java у меня есть:
class main {
public static void main(String[] args) {
System.loadLibrary("api");
APIClass api = new APIClass();
api.mbstowcsTest();
}
}
Проблема в коде Java заключается в том, что всякий раз, когда код достигает mbstowcs()
в APIClass::mbstowcsTest()
все, что я получаю, это выходные данные типа Process finished with exit code -1073740791 (0xC0000409)
.Может кто-нибудь сказать мне, почему это проблема?Я попытался использовать другие функции из stdlib.h
, такие как abs()
, и это сработало.