我已經使用Visual Studio 2010編寫了一個C++ DLL。所以,我有一個暴露了一些類和方法的DLL文件。這個DLL正在另一個C++項目中使用,沒有問題。UnsatisfiedLinkError使用SWIG包裝C++ DLL以允許Java開發人員使用它
現在,我想創建一個Java/Python包裝,以在其他Java/Python項目中使用我的庫。在閱讀了選項後,我決定與SWIG一起去。所以,我寫了一些接口文件來告訴SWIG我要包裝哪些類和方法(基本上,那些在我的頭文件中使用__declspec(dllexport))。我已經配置了Visual Studio 2010,以便在生成DLL文件後立即提升SWIG。基本上,這SWIG線成功一代的DLL文件後執行:
swig.exe -c++ -java "%(FullPath)"
存在 「FULLPATH」 之路,是.i文件。
我。我的文件看起來像這樣:
%module my_module
%{
#include "OneOfMyHeaders.h"
%}
%include <windows.i>
%include "OneOfMyHeaders.h"
OneOfMyHeaders.h
包含myFunction
,我想從Java調用。我可以成功運行SWIG,並生成.java/.class
文件。但是,當我嘗試運行一個虛擬的Java主程序(只調用Java包裝在C++方法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。
提前感謝
您是否嘗試過構建並運行SWIG附帶的Java示例之一? – Schollii
是的,我做的第一件事。但是,謝謝,因爲我仔細檢查了它,並意識到我忘了將.cxx文件添加到Visual Studio項目。這是問題所在。 – jorgeas80