“线程中的异常”;“主要”;java.lang.UnsatifiedLinkError
在Java中测试JNI时,我得到以下显式错误:“线程中的异常”;“主要”;java.lang.UnsatifiedLinkError,java,c++,dll,java-native-interface,Java,C++,Dll,Java Native Interface,在Java中测试JNI时,我得到以下显式错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Italk2learn.hello()V at Italk2learn.hello(Native Method) at Italk2learn.main(Italk2learn.java:10) dll或路径没有问题,因为my java类的静态代码运行良好: static { try {
Exception in thread "main" java.lang.UnsatisfiedLinkError: Italk2learn.hello()V
at Italk2learn.hello(Native Method)
at Italk2learn.main(Italk2learn.java:10)
dll或路径没有问题,因为my java类的静态代码运行良好:
static {
try {
System.loadLibrary("Italk2learn");
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
而且我认为它可以很好地利用图书馆
使用JVM 32位编译并获得C++的C++头(JavaH)和明文32。在这两种情况下,我都使用Eclipse作为C++和java。 这是我的代码:
爪哇: C++:#包括
#包括
#包括“italk2learn.h”
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv*,jobject){
PrtTf(“你好世界C++”!\n);
#ifdef_uucplusplus
printf(“\uuucplusplus已定义\n”);
#否则
printf(“\uuucplusplus未定义\n”);
#恩迪夫
返回;
}
<代码> > p>如果你用C++编译,你必须用Java>外写“C”<代码>来包装你的JNI方法,以确保编译器不应用它自己的字符:
extern "C" {
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
// ..
}
}
<>参见:< P>如果你用C++编译,你必须用Java>外写“C”< /C>来包装你的JNI方法,以确保编译器不应用它自己的字符:
extern "C" {
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
// ..
}
}
请看:我找到了答案!似乎在Windows中使用JNI时,它会查找以\u Java\u
开头的函数,而在其他所有平台中,它都会查找Java\u
。我不知道为什么会出现这种情况,并且没有写在文档中,但它使一切工作都完美无瑕
当javah创建头文件时,每个函数的名称都类似于Java_package_Class_method。奇怪的是,当像这样编译时,JNI无法为本机方法找到正确的函数并抛出错误,但是如果在Java之前添加下划线,那么JNI将能够找到该函数。我找到了答案!似乎在Windows中使用JNI时,它会查找以\u Java\u
开头的函数,而在其他所有平台中,它都会查找Java\u
。我不知道为什么会出现这种情况,并且没有写在文档中,但它使一切工作都完美无瑕
当javah创建头文件时,每个函数的名称都类似于Java_package_Class_method。奇怪的是,当像这样编译时,JNI无法为本机方法找到正确的函数并抛出错误,但是如果在Java之前添加下划线,那么JNI将能够找到该函数。您是如何构建DLL的?如果你查看<代码> ITAK2Deal.DLL<代码>它有多大,它在你的路径中吗?我使用GCC C++编译器和Eclipse。大小为75 KB(包括MinGW和JNI),是的,它位于我的windows环境变量路径中。您是如何构建DLL的?如果你查看<代码> ITAK2Deal.DLL<代码>它有多大,它在你的路径中吗?我使用GCC C++编译器和Eclipse。大小为75 KB(包括MinGW和JNI),是的,它位于我的windows环境变量路径中。javah
在生成到.h文件的声明中已经这样做了,在.cpp文件中包含.h文件将其应用于声明中的定义。javah
在生成到.h文件的声明中已经这样做了,并且在.cpp文件中包含.h文件将其应用于声明中的定义。
extern "C" {
JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
// ..
}
}