2013-01-22 95 views
2

我想使用JDK 1.7.0和JavaCpp 0.3(bin)在Windows XP Professional(x86)上使用Visual Studio 2008構建和運行JavaCpp的LegacyLibrary Example,並且獲取以下輸出。錯誤出現在最後一個命令java -cp javacpp.jar LegacyLibrary上。UnsatisfiedLinkException當運行JavaCpp示例(LegacyLibrary)

C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp>dir 
Volume in drive C has no label. 
Volume Serial Number is 9099-0685 

Directory of C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hell 
o_JNI\src\graf\JavaCpp 

22/01/2013 10:19 AM <DIR>   . 
22/01/2013 10:19 AM <DIR>   .. 
04/11/2012 09:00 PM   109,991 javacpp.jar 
22/01/2013 10:18 AM    297 LegacyLibrary.h 
22/01/2013 10:19 AM    1,058 LegacyLibrary.java 
       3 File(s)  111,346 bytes 
       2 Dir(s) 362,833,334,272 bytes free 

C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp>javac -cp javacpp.jar LegacyLibrary.java 

C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp>java -jar javacpp.jar LegacyLibrary 
Generating source file: C:\Documents and Settings\Brian\My Documents\Projects\Co 
py of Hello_JNI\src\graf\JavaCpp\jniLegacyLibrary.cpp 
Building library file: C:\Documents and Settings\Brian\My Documents\Projects\Cop 
y of Hello_JNI\src\graf\JavaCpp\windows-x86\jniLegacyLibrary.dll 
cl /IC:\jdk1.7.0\include /IC:\jdk1.7.0\include\win32 "C:\Documents and Settings\ 
Brian\My Documents\Projects\Copy of Hello_JNI\src\graf\JavaCpp\jniLegacyLibrary. 
cpp" /W3 /Oi /O2 /EHsc /Gy /GL /MD /LD /link "/OUT:C:\Documents and Settings\Bri 
an\My Documents\Projects\Copy of Hello_JNI\src\graf\JavaCpp\windows-x86\jniLegac 
yLibrary.dll" /LIBPATH:C:\jdk1.7.0\lib /LIBPATH:C:\jdk1.7.0\jre\bin\server jvm.l 
ib 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

jniLegacyLibrary.cpp 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(113) : warning C4996: 'strcpy': This function or v 
ariable may be unsafe. Consider using strcpy_s instead. To disable deprecation, 
use _CRT_SECURE_NO_WARNINGS. See online help for details. 
     c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\string.h(74) : s 
ee declaration of 'strcpy' 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(115) : warning C4996: 'strncpy': This function or 
variable may be unsafe. Consider using strncpy_s instead. To disable deprecation 
, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
     c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\string.h(157) : 
see declaration of 'strncpy' 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(185) : warning C4996: 'strdup': The POSIX name for 
this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See 
online help for details. 
     c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\string.h(207) : 
see declaration of 'strdup' 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(340) : warning C4244: 'argument' : conversion from 
'jlong' to 'size_t', possible loss of data 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(354) : warning C4244: 'argument' : conversion from 
'jlong' to 'size_t', possible loss of data 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(370) : warning C4244: 'argument' : conversion from 
'jlong' to 'size_t', possible loss of data 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(385) : warning C4244: 'argument' : conversion from 
'jlong' to 'size_t', possible loss of data 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(393) : warning C4244: 'argument' : conversion from 
'jlong' to 'size_t', possible loss of data 
C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp\jniLegacyLibrary.cpp(956) : warning C4800: 'jboolean' : forcing value t 
o bool 'true' or 'false' (performance warning) 
Microsoft (R) Incremental Linker Version 9.00.21022.08 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:jniLegacyLibrary.dll 
/ltcg 
/dll 
/implib:jniLegacyLibrary.lib 
"/OUT:C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\sr 
c\graf\JavaCpp\windows-x86\jniLegacyLibrary.dll" 
/LIBPATH:C:\jdk1.7.0\lib 
/LIBPATH:C:\jdk1.7.0\jre\bin\server 
jvm.lib 
jniLegacyLibrary.obj 
    Creating library jniLegacyLibrary.lib and object jniLegacyLibrary.exp 
Generating code 
Finished generating code 

C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp>java -cp javacpp.jar LegacyLibrary 
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Documents and Sett 
ings\Brian\Local Settings\Temp\javacpp92803190928456\jniLegacyLibrary.dll: Can't 
find dependent libraries 
     at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
     at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1928) 
     at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1825) 
     at java.lang.Runtime.load0(Runtime.java:792) 
     at java.lang.System.load(System.java:1059) 
     at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:422) 
     at com.googlecode.javacpp.Loader.load(Loader.java:372) 
     at com.googlecode.javacpp.Loader.load(Loader.java:319) 
     at LegacyLibrary$LegacyClass.<clinit>(LegacyLibrary.java:8) 
     at LegacyLibrary.main(LegacyLibrary.java:22) 

C:\Documents and Settings\Brian\My Documents\Projects\Copy of Hello_JNI\src\graf 
\JavaCpp> 

回答

1

問題在於Visual Studio 2005和VS 2008不會自動鏈接到VC++的內部庫。解決方案是將清單與可執行文件中所需的庫捆綁在一起,如here所述,或僅使用Visual Studio 2010或更新版本。我使用VS 2010,我可以驗證示例現在按預期運行。如果您碰巧嘗試捆綁清單,請對其他人進行評論以確認這是一個有效的修補程序。

來源:https://groups.google.com/forum/#!topic/javacpp-project/kljspKIxH9M

0

看來java找不到.dll文件。嘗試將其放入執行類文件的相同目錄中。

順便說一句,你如何在Java中加載庫?

+0

Java * *可以找到.dll文件。如果我刪除了.dll文件,它會給出不同的異常(「java.lang.UnsatisfiedLinkError:java.library.path中沒有jniLegacyLibrary」與「不能 找到相關庫」) – StockB

+0

Sry,我的錯。你的庫是否動態鏈接到其他庫? – Dan

+0

您可以在此查看確切的代碼和命令(http://code.google.com/p/javacpp/#Accessing_Native_APIs)。 – StockB