[英]Exception in thread "main" java.lang.UnsatisfiedLinkError"
[英]Exception in thread “main” java.lang.UnsatisfiedLinkError
在 Java 中测试 JNI 时出现以下显式错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Italk2learn.hello()V
at Italk2learn.hello(Native Method)
at Italk2learn.main(Italk2learn.java:10)
dll 或路径没有问题,因为我的 java 类的静态代码运行良好:
static {
try {
System.loadLibrary("Italk2learn");
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
而且我认为它可以让图书馆很好。
我使用 JVM 32 位编译并获取 C++ 头文件(javah)和 MinGW32 for C++。 在这两种情况下,我都将 eclipse 用于 C++ 和 Java。
这是我的代码:
爪哇:
public class Italk2learn {
public native void hello();
public static void main(String[] args) {
System.out.println("Hello World Java!");
try {
new Italk2learn().hello();
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
static {
try {
System.loadLibrary("Italk2learn");
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
}
C++:
#include <jni.h>
#include <stdio.h>
#include "italk2learn.h"
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
printf("Hello World C++!\n");
#ifdef __cplusplus
printf("__cplusplus is defined\n");
#else
printf("__cplusplus is NOT defined\n");
#endif
return;
}
如果您使用 C++ 进行编译,则必须使用extern "C"
包装您的 JNI 方法,以确保编译器不会应用自己的修改:
extern "C" {
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
// ..
}
}
请参阅: http : //docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp224
我找到了答案! 似乎在 Windows 中使用 JNI 时,它寻找以_Java_
开头的函数,而在其他所有平台中,它寻找Java_
。 为什么会这样,而不是写在文档中我不知道,但它使一切工作完美!
当 javah 创建头文件时,每个函数都被命名为 Java_package_Class_method。 奇怪的是,像这样编译时,JNI 无法找到适合本地方法的函数并吐出错误,但是如果在 Java 之前添加下划线,则 JNI 将能够找到该函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.