UnsatisfiedLinkError使用SWIG包装C ++ DLL以允许Java开发人员使用它

时间:2014-04-01 10:55:36

标签: java c++ visual-studio-2010 dll swig

我使用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,主要是。

非常感谢提前

1 个答案:

答案 0 :(得分:2)

解决。我没有在Visual Studio项目中包含生成的.cxx文件。因此,它的功能没有联系。包括它之后,一切正常。