Java JNI与不满意链接错误
我正在使用JNI执行我的第一步,并尝试编写一个简单的Hello Java程序,但由于以下错误而失败:Java JNI与不满意链接错误,java,c,java-native-interface,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 {
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();
}
}
HelloJava.c是使用javah-jni-HelloJava
生成的
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");
}
#包括
#包括
#包括“HelloJava.h”
JNIEXPORT void JNICALL Java\u HelloJava\u dostuff
(JNIEnv*env,jobject this)
{
printf(“这来自C!:)\n”);
}
我在Windows上使用gcc将其编译为共享库(.dll)
现在运行Java.class文件时,出现上述异常您能告诉我出现此错误的原因吗?
顺便问一下,你能告诉我如何用C++ +J/NP>使用JNI吗?
更新
也许你想自己试试?我真的找不到这个问题。这里有一个链接,您可以从中下载一个包含所有文件(已编译文件)的.zip文件
服务器重试了所有操作,但仍然是同一问题。以下是我所做的步骤:
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
可以解决问题。感谢A.H.的帮助 请检查:
- 库的文件名是
(在Windows上)HelloJavaDLL.dll
- DLL的目录位于库搜索路径(即
环境变量)中,或者通过path
提供给-Djava.library.path=C:\WhereEverItIs
java
第二个问题:JNI支持C和C++的直接对话。如果您查看生成的头文件和
jni.h
文件,您将看到这一点。请提供准确的gcc命令行以及java-version
的输出。您是否查看了将标题键入“搜索”框的3500多个结果?我愿意你在那里找到答案:+1,比我的答案更完整。我要把我的拿走。没错,在本地方法的定义中可以使用C++代码,并且可以在C++代码中使用JNI函数。1。是,库的名称正确,2。我不认为找不到库不是问题,删除.dll文件会导致另一个不满意的链接错误,消息是:library HelloJavaDLL不在java.library.path中,但我会检查它,谢谢。因此,关于GCC的确切编译器参数的问题就出现了。可能存在一些开关,这些开关会影响默认情况下GCC使用的ABI/调用约定。Windows也有一些……这是完整的gcc命令:gcc HelloJava.c-I“c:\Program Files(x86)\Java\jdk1.7.0\include“-I”c:\Program Files(x86)\Java\jdk1.7.0\include\win32“-o HelloJavaDLL.dll-shared
编译后,我只运行Java HelloJava
。谢谢你肯定不是因为图书馆没找到。