我使用Visual Studio 2010编写了一个C ++ DLL。因此,我有一个DLL文件,其中包含一些类和方法。这个DLL正在另一个C ++项目中使用而没有问题。
现在,我想创建一个 Java / Python包装器,以便在其他Java / Python项目中使用我的库。在阅读了有关选项后,我决定选择 SWIG 。所以,我写了一些接口文件来告诉SWIG我想要包装哪些类和方法(基本上,在我的头文件中用 __ declspec(dllexport)暴露的那些)。我已经将Visual Studio 2010配置为在生成DLL文件之后引发SWIG。基本上,这个SWIG行在成功生成DLL文件后执行:
swig.exe -c++ -java "%(FullPath)"
“ FullPath ” .i文件的路径。
我的.i文件看起来像这样:
%module my_module
%{
#include "OneOfMyHeaders.h"
%}
%include <windows.i>
%include "OneOfMyHeaders.h"
OneOfMyHeaders.h
包含myFunction
,我想从Java调用。我可以成功运行SWIG,并生成.java/.class
个文件。但是当我尝试运行虚拟Java主程序(只是通过C ++方法调用Java包装器myFunction
)时,我收到此错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: my_moduleJNI.myFunction()V
...
任何电话都会发生这种情况。如果我以这种方式修改我的接口文件也会发生这种情况:
%module my_module
%{
#include "OneOfMyHeaders.h"
%}
%include <windows.i>
__declspec(dllimport) void myFunction();
因此,不是直接包含头文件(它可能包含其他头文件,这可能会导致问题,正如我在doc中所读到的那样),我公开了我的函数。同样的错误。
我做错了什么?
我应该指定任何其他SWIG参数吗?
还有比SWIG更好的选择吗?
我想要Java和Python包装器,但获取Ruby / PHP包不会受到伤害。我之所以选择SWIG,主要是。
非常感谢提前
答案 0 :(得分:2)
解决。我没有在Visual Studio项目中包含生成的.cxx文件。因此,它的功能没有联系。包括它之后,一切正常。