“线程中的异常”;“主要”;java.lang.UnsatifiedLinkError

“线程中的异常”;“主要”;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 {

在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 {
            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) {
        // ..
    }
}