不满意的LinkError 用SWIG包装C++DLL,以允许Java开发人员使用它
UnsatisfiedLinkError Wrapping C++ DLL with SWIG to allow Java developers to use it
我用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文件。因此,它的功能没有链接。包含它后,一切正常。
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 我正在开发服务器,ip作为参数传递不起作用
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- C++如何告诉开发人员在设计模板(如Java接口)时实现某事
- 使用 C++ 和 Java 进行 Android 开发(使用不使用其中之一)
- 如何使用插件CDT在Eclipse中为Java开发人员配置OpenCV
- 使用Java的Android QT开发 - 替代方案
- 用于桌面和平板电脑开发的Java与C变体
- 我们不能只用Java开发Android应用程序吗?
- 作为 Java 开发人员,了解 C++ 中的 Map
- 寻找一个类似Cppcheck的Java开发工具
- 没有任何Java的原生安卓开发
- 如何在Android开发中使用JNI将位图从Java传递到C++
- Android应用程序开发中的Java与原生编码
- 不满意的LinkError 用SWIG包装C++DLL,以允许Java开发人员使用它