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\
现在一切正常
我有某种库,我正在为其编写包装器,然后我尝试在其上生成 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\
现在一切正常