Java SWIG 包装器与直接函数调用

Java SWIG wrapper vs direct function calling

我有某种库,我正在为其编写包装器,然后我尝试在其上生成 SWIG 包装器,以便我可以直接从 Java.

进行调用

我遇到了一个无法调试的问题,因为基本上有 0 个信息(Java 方)。这就是我正在处理的事情。我有这样的自定义 class:

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"

基本上,如果我在 C++ 主函数中调用 APIClass::mbstowcsTest(),一切都进行得很顺利,并且 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 代码中的问题是,每当代码在 APIClass::mbstowcsTest() 中达到 mbstowcs() 时,我得到的只是像 Process finished with exit code -1073740791 (0xC0000409) 这样的输出。谁能告诉我为什么这是个问题?我尝试使用 stdlib.h 中的其他函数,例如 abs(),它起作用了。

事实证明,必须使用与 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\

现在一切正常