ECLIPSE - 使用JNI时的java.lang.UnsatisfiedLinkError

时间:2014-08-12 11:21:36

标签: java eclipse java-native-interface

大家好:我在Windows 7上与JNI一起练习。 我的目标是在Eclipse控制台上打印一个" Hello world"使用C&#API的消息。

我一直在

Exception in thread "main" java.lang.UnsatisfiedLinkError: nativeStuff.HelloJNI.sayHello()V at nativeStuff.HelloJNI.sayHello(Native Method) at main.Init.main(Init.java:17)

在我的项目中Properties - > Libraries - > jre8 - > Native Library Location - > Edit - > Workspace我将nativeStuff设置为所选文件夹,因为库hello.dll就在那里,但我一直收到有关UnsatisfiedLinkError的错误。

这是源树:

src(folder):
    main(package):
        Init.java
    nativeStuff(package):
        HelloJNI.java
        hello.dll
        HelloJNI.c
        nativeStuff_HelloJNI.h

Init.java:

public class Init {

    public static void main(String[] args) {
        System.out.println("Begin");
        new HelloJNI().sayHello(); // from the exception above
    }
}

HelloJNI.java:

public class HelloJNI {
    static {
        try {
            System.loadLibrary("hello");
        } catch(UnsatisfiedLinkError u) { // always from the exception above
            u.printStackTrace();
        } catch(SecurityException s) {
            s.printStackTrace();
        }
    }
    public native void sayHello();  
}

nativeStuff_HelloJNI.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class nativeStuff_HelloJNI */

#ifndef _Included_nativeStuff_HelloJNI
#define _Included_nativeStuff_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     nativeStuff_HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_nativeStuff_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

和HelloJNI.c:

#include "jni.h"
#include <stdio.h>
#include "nativeStuff_HelloJNI.h"

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

[编辑] :这些是我为获取文件而输入的命令......

javac HelloJNI.java
javah -jni nativeStuff.HelloJNI
gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c

1 个答案:

答案 0 :(得分:1)

System.loadLibrary适用于系统库,系统库通常位于jre子文件夹中。如果要加载示例中的本地库,请改为使用:

System.load("/path/to/your/lib.ext")

请参阅jre javadoc


最后,错误是:函数名称必须是合格的:Java_nativeCode_HelloJNI_sayHello而不是{。1}} .h和.c