Оболочка Java SWIG против прямого вызова функции - PullRequest
0 голосов
/ 03 октября 2018

У меня есть какая-то библиотека, для которой я пишу оболочку, и затем я пытаюсь сгенерировать оболочку 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(), и это сработало.

1 Ответ

0 голосов
/ 04 октября 2018

Оказалось, что необходимо использовать те же флаги компилятора, что и при компиляции Visual Studio 2013.Поэтому пакетный скрипт должен выглядеть как минимум:

@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= /Zi /nologo /W3 /WX- /sdl /Od /Oy-^
    /D WIN32 /D _DEBUG /D _CONSOLE /D _LIB /D _CRT_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_DEPRECATE^
    /D _UNICODE /D UNICODE^
    /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /LD

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"
popd

COPY .\build\api.dll .\java\

Теперь все работает так же хорошо

...