不满意的LinkError 用SWIG包装C++DLL,以允许Java开发人员使用它

UnsatisfiedLinkError Wrapping C++ DLL with SWIG to allow Java developers to use it

本文关键字:开发 Java LinkError SWIG 包装 C++DLL 不满意      更新时间:2023-10-16

我用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)"

"完整路径"是 .i 文件的路径。

我的 .i 文件如下所示

%module my_module
%{
#include "OneOfMyHeaders.h"
%}
%include <windows.i>
%include "OneOfMyHeaders.h"

OneOfMyHeaders.h包含我想从Java调用的myFunction。我可以成功运行 SWIG,并生成.java/.class文件。但是当我尝试运行一个虚拟的 Java 主程序(只需通过方法 myFunction 调用 Java 包装器C++ 时,我收到此错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: my_moduleJNI.myFunction()V
...

任何调用都会发生这种情况。如果我以这种方式修改我的界面文件,也会发生这种情况:

%module my_module
%{
#include "OneOfMyHeaders.h"
%}
%include <windows.i>
__declspec(dllimport) void myFunction();

因此,我不是直接包含头文件(它可能包含其他头文件,正如我在文档中读到的那样,这可能会导致问题),而是公开了我的函数。同样的错误。

我做错了什么?

我是否应该指定任何其他 SWIG 参数?

除了SWIG还有比SWIG更好的选择吗?

我想要Java和Python包装器,但获得Ruby/PHP包装器不会有什么坏处。我选择SWIG主要是出于这个原因。

提前非常感谢

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