日期:2014-05-20  浏览次数:21115 次

jni 异常:Exception in thread "main" java.lang.UnsatisfiedLinkError: hello
java代码:
public   class   TestDLL   {
static{
System.loadLibrary( "goodluck ");
}
public   native   void   hello();

public   static   void   main(String[]   args){
System.out.println(System.getProperty( "java.library.path "));
System.out.println( "start ");
new   TestDLL().hello();
}
}

c头文件   javah生成
/*   DO   NOT   EDIT   THIS   FILE   -   it   is   machine   generated   */
#include   "jni.h "
/*   Header   for   class   TestDLL   */

#ifndef   _Included_TestDLL
#define   _Included_TestDLL
#ifdef   __cplusplus
extern   "C "   {
#endif
/*
  *   Class:           TestDLL
  *   Method:         hello
  *   Signature:   ()V
  */
JNIEXPORT   void   JNICALL   Java_TestDLL_hello
    (JNIEnv   *,   jobject);

#ifdef   __cplusplus
}
#endif
#endif

c源文件:
#include   "goodluck.h "
#include   "stdio.h "
JNIEXPORT   void   JNICALL   Java_TestDLL_hello(JNIEnv   *   env,   jclass   jc){

printf( "hello\n ");
}

执行时,总是报Exception   in   thread   "main "   java.lang.UnsatisfiedLinkError:   hello
当然dll文件   在当前目录   system32下都放过。

------解决方案--------------------
当使用 JNI 从 Java 程序访问本机代码时,您会遇到许多问题。您会遇到的三个最常见的错误是:

无法找到动态链接。它所产生的错误消息是:java.lang.UnsatisfiedLinkError。这通常指无法找到共享库,或者无法找到共享库内特定的本机方法。


无法找到共享库文件。当用 System.loadLibrary(String libname) 方法(参数是文件名)装入库文件时,请确保文件名拼写正确以及没有指定扩展名。还有,确保库文件的位置在类路径中,从而确保 JVM 可以访问该库文件。


无法找到具有指定说明的方法。确保您的 C/C++ 函数实现拥有与头文件中的函数说明相同的说明。
(摘自IBM中文网)
------解决方案--------------------
(new TestDLL()).hello();