2013-10-17 94 views
1

我從嘗試你好世界JNI:JNI HellowWorld unsatisfiedlinkError找不到依賴庫

http://home.pacifier.com/~mmead/jni/cs510ajp/

我做的Java類:

public class ACTICamWrapperJNI { 
    public native void displayMessage(); 
    static 
    { 
    System.loadLibrary("HelloWorldImp"); 

} 

} 

,並調用它:

 public static void main(String args[]) { 

      //</editor-fold> 
    System.out.println(System.getProperty("java.library.path")); 

    ACTICamWrapperJNI test = new ACTICamWrapperJNI(); 
    } 

該cpp文件看起來像:

#include <stdio.h> 
#include "HelloWorld.h" // this header file was generated by javah 
JNIEXPORT void JNICALL Java_HelloWorld_displayMessage(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
} 

我切換到JDK的x86與X86編譯:

C:\Development\testJNI>javac HelloWorld.java 

C:\Development\testJNI>javac HelloWorld.java 

C:\Development\testJNI>javah -jni HelloWorld 

我用MINGW32的海合會我在QT文件夾(希望這是確定)

C:\Development\testJNI>gcc -shared -I "C:\Program Files (x86)\Java\jdk1.7.0_40\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_40\include\win32" HelloWorld.cpp -o HelloWorldImp.dll 

注意我必須添加共享,否則我得到了錯誤:

undefined reference to `[email protected]' 

C:\Development\testJNI>"C:\Program Files (x86)\Java\jdk1.7.0_40\bin\java.exe" Main 
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.displayMessage()V 
     at HelloWorld.displayMessage(Native Method) 
     at Main.main(Main.java:9) 

請注意,我已經mak確保我正在運行x32 jdk的java並使用x32版本進行編譯,因爲我的系統上也有x64。

試戴NetBean IDE以及並得到了該問題:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\HelloWorldImp.dll: Can't find dependent libraries 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1957) 
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1882) 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1872) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
    at java.lang.System.loadLibrary(System.java:1087) 
    at au.com.ricor.ACTICamWrapperJNI.<clinit>(ACTICamWrapperJNI.java:15) 
    at au.com.ricor.CameraPanel.main(CameraPanel.java:58) 

除了GCC我用的版本是:

C:\Development\testJNI>gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=c:/qt/tools/mingw48_32/bin/../libexec/gcc/i686-w64-mingw32/4 
.8.0/lto-wrapper.exe 
Target: i686-w64-mingw32 
Configured with: ../../../src/gcc-4.8.0/configure --host=i686-w64-mingw32 --buil 
d=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/t 
emp/x32-480-posix-dwarf-r2/mingw32 --enable-shared --enable-static --disable-mul 
tilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable- 
threads=posix --enable-libgomp --enable-lto --enable-graphite --enable-checking= 
release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --d 
isable-sjlj-exceptions --with-dwarf2 --disable-isl-version-check --disable-cloog 
-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-boots 
trap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --d 
isable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic 
--with-host-libstdcxx='-static -lstdc++' --with-libiconv --with-system-zlib --wi 
th-gmp=/temp/mingw-prereq/i686-w64-mingw32-static --with-mpfr=/temp/mingw-prereq 
/i686-w64-mingw32-static --with-mpc=/temp/mingw-prereq/i686-w64-mingw32-static - 
-with-isl=/temp/mingw-prereq/i686-w64-mingw32-static --with-cloog=/temp/mingw-pr 
ereq/i686-w64-mingw32-static --enable-cloog-backend=isl --with-pkgversion='rev2, 
Built by MinGW-builds project' --with-bugurl=http://sourceforge.net/projects/mi 
ngwbuilds/ CFLAGS='-O2 -pipe -I/temp/x32-480-posix-dwarf-r2/libs/include -I/temp 
/mingw-prereq/x32-zlib/include -I/temp/mingw-prereq/i686-w64-mingw32-static/incl 
ude' CXXFLAGS='-O2 -pipe -I/temp/x32-480-posix-dwarf-r2/libs/include -I/temp/min 
gw-prereq/x32-zlib/include -I/temp/mingw-prereq/i686-w64-mingw32-static/include' 
CPPFLAGS= LDFLAGS='-pipe -L/temp/x32-480-posix-dwarf-r2/libs/lib -L/temp/mingw- 
prereq/x32-zlib/lib -L/temp/mingw-prereq/i686-w64-mingw32-static/lib -L/temp/x32 
-480-posix-dwarf-r2/mingw32/opt/lib' 
Thread model: posix 
gcc version 4.8.0 (rev2, Built by MinGW-builds project) 

感謝

威廉

回答

0

無論是將該課程重命名爲au.com.ricor.ACTICamWrapperJNI的HelloWorld,或本機功能(在C++文件)從Java_HelloWorld_displayMessage()Java_au_com_ricor_ACTICamWrapperJNI_displayMessage()

0

我知道這有一個答案,但我確定,如果你正在編譯爲調試,它不能再分配給另一臺PC;你可以嘗試編譯發佈,並應該工作。我只是用這個來解決my own issue