JNI和UnsatisfiedLinkError

时间:2011-09-22 20:16:38

标签: java c java-native-interface

我正在使用JNI执行我的第一步,并尝试编写一个简单的 Hello Java 程序,但它失败并出现此错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloJava.dostuff()V
        at HelloJava.dostuff(Native Method)
        at HelloJava.main(HelloJava.java:12)

这是我的Java类:

class HelloJava {
    private native void dostuff();
    static {
        System.loadLibrary("HelloJavaDLL");
    }

    public static void main(String[] args) {
        System.out.println("This is from java.");
        HelloJava j = new HelloJava();
        j.dostuff();
    }
}

使用javah -jni HelloJava生成HelloJava.c。

C实现如下所示:

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

JNIEXPORT void JNICALL Java_HelloJava_dostuff
  (JNIEnv *env, jobject this)
{
    printf("And this comes from C ! :)\n");
}

我在Windows上使用gcc编译它到共享库(.dll)。

现在运行Java .class文件,发生上面的异常。 你能告诉我为什么会出现这个错误吗?

顺便问一下,你能告诉我如何在C ++中使用JNI吗?

更新

也许你想自己尝试一下?我真的找不到问题。这是MediaFire的链接,您可以在其中下载包含所有文件的.zip文件(事件是已编译的文件)。

重试了一切,但仍然是同一个问题 Theese是我做的步骤:

  1. 编写Hello.java
  2. 使用javac Hello.java
  3. 编译Hello.java
  4. 使用javah -jni Hello
  5. 创建标题文件
  6. 编写Hello.c文件
  7. 使用
    编译Hello.c文件 gcc Hello.c -shared -o Hello.dll -I"C:\Java\jdk1.7.0\include" -I"C:\Java\jdk1.7.0\include\win32"
  8. 使用java Hello
  9. 执行Hello.class

    感谢。

    -Wl,--kill-at添加到gcc命令可以解决问题,根据此question。 感谢A.H.的帮助!

1 个答案:

答案 0 :(得分:3)

请检查:

  • 您的资料库的文件名为HelloJavaDLL.dll(在Windows上)
  • DLL的目录位于库搜索路径(即PATH环境变量)中,或通过java提供给-Djava.library.path=C:\WhereEverItIs

第二个问题:JNI开箱即用支持两个 C和C ++。如果您查看生成的头文件,并在jni.h文件中,您将看到此内容。