2014-11-04 45 views
3

我使用swig將C++轉換爲Java。 我使用g ++來創建DLL和編譯。Swig C++到Java UnsatisfiedLinkError

swig -c++ -java -package preprocessor Point.i 
g++ -c -std=c++11 Point.cpp Point_wrap.cxx -I E:\ProgramFiles\jdk\include -I E:\ProgramFiles\jdk\include\win32 
g++ -shared Point_wrap.o Point.o -o point.dll 

編譯和創建dll時沒有任何錯誤。 因此,當我把生成的java文件和dll添加到我的項目中時,我創建一個新對象時出現UnsatisfiedLinkError。它只在我使用Windows 8.1 x86時出現。在x64版本上一切正常。

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: preprocessor.PointClassJNI.new_Point__SWIG_0()J 
at preprocessor.PointClassJNI.new_Point__SWIG_0(Native Method) 
at preprocessor.Point.<init>(Point.java:78) 
at GUI.FileWorker.fileParser(FileWorker.java:45) 
at GUI.MainWindow$2.actionPerformed(MainWindow.java:139) 

這是swig生成的,當我創建point = new Point()時發生錯誤的地方;

public Point() { 
    this(PointClassJNI.new_Point__SWIG_0(), true); 
    } 

也許有人有這個問題。我會非常感謝任何幫助!

+0

你在哪裏調用System.loadLibrary(「point.dll」)? – rkapl 2014-11-04 21:55:14

+0

我在創建新對象的方法之前在靜態塊中調用它。位於根項目文件夾中的point.dll。 – Joks 2014-11-04 22:13:47

+0

該DLL是在32位機器上編譯的? (也許你可以上傳得到的DLL的地方?) – rkapl 2014-11-04 22:19:48

回答

2

最後我在這question找到解決方案。 只需在我的.bat文件中添加-Wl, - add-stdcall-alias即可創建dll。

swig -c++ -java -package preprocessor Point.i 
g++ -c -std=c++11 Point.cpp Point_wrap.cxx -I E:\ProgramFiles\jdk\include -I E:\ProgramFiles\jdk\include\win32 
g++ -shared Point_wrap.o Point.o -Wl,--add-stdcall-alias -o point.dll 

rkapl,謝謝回覆!