我正在使用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是我做的步骤:
javac Hello.java
javah -jni Hello
gcc Hello.c -shared -o Hello.dll -I"C:\Java\jdk1.7.0\include" -I"C:\Java\jdk1.7.0\include\win32"
java Hello
感谢。
将-Wl,--kill-at
添加到gcc命令可以解决问题,根据此question。
感谢A.H.的帮助!
答案 0 :(得分:3)
请检查:
HelloJavaDLL.dll
(在Windows上)PATH
环境变量)中,或通过java
提供给-Djava.library.path=C:\WhereEverItIs
。第二个问题:JNI开箱即用支持两个 C和C ++。如果您查看生成的头文件,并在jni.h
文件中,您将看到此内容。