JNI UnsatisfiedLinkError即使在所有内容编译好之后也是如此

时间:2014-12-30 04:32:39

标签: java-native-interface unsatisfiedlinkerror

我开始研究Java的JNI功能。我按照这个[教程] [1]。所以我的班级是这样的:

    package me.gagan.pheonix.natve;
    public class HelloJNI {
        static {
            System.loadLibrary("hello");
        }
        private native void sayHello();
        public static void main(String... args) {
        new HelloJNI().sayHello();
        }
    }


HelloJNI.c file like this:

    \#include <jni.h>
    \#include <stdio.h>
    \#include "me_gagan_pheonix_natve_HelloJNI.h"
    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
       printf("Hello World in native C!\n");
       return;
    }

我的目录结构是:

<pre>
C:.
├───bin
│   ├───me
│   │   └───gagan
│   │       └───pheonix
│   │           └───natve
│   │               └───HelloJNI.class
│   ├───resources
│   │   └───hello.dll
│   ├───me_gagan_pheonix_natve_HelloJNI.h
│   └───HelloJNI.c
└───src
    ├───me
    │   └───gagan
    │       └───pheonix
    │           └───natve
    │               └───HelloJNI.java
    └───resources
</pre>

我还添加了

    -Djava.library.path=C:\Gagan\workspace\Pheonix\bin\resources

但仍然会出现错误。不知道出了什么问题。正确地遵循每一步。 以下命令对我有用

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

    echo %JAVA_HOME%
    C:\Java\jdk1.6.0_45

    javah -verbose -jni -classpath . me.gagan.pheonix.natve.HelloJNI

编辑:

遇到异常是:

Exception in thread "main" java.lang.UnsatisfiedLinkError: me.gagan.pheonix.natve.HelloJNI.sayHello()V
    at me.gagan.pheonix.natve.HelloJNI.sayHello(Native Method)
    at me.gagan.pheonix.natve.HelloJNI.main(HelloJNI.java:12)


  [1]: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

你们有什么建议吗?

1 个答案:

答案 0 :(得分:0)

package me.gagan.pheonix.natve;
public class HelloJNI {
...
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {

使用javah生成.h文件后,您已更改了软件包名称。再做一次,并相应地调整.c文件中的函数名,以便同意.h文件中的声明。