2014-04-01 21 views
1

我已經使用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。

提前感謝

+0

您是否嘗試過構建並運行SWIG附帶的Java示例之一? – Schollii

+0

是的,我做的第一件事。但是,謝謝,因爲我仔細檢查了它,並意識到我忘了將.cxx文件添加到Visual Studio項目。這是問題所在。 – jorgeas80

回答

2

解決。我沒有在Visual Studio項目中包含生成的.cxx文件。所以,它的功能沒有聯繫。包括它後,一切工作正常。

相關問題