2013-10-17 91 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