Java 不满意的链接错误ClassName.methodName()V
我正在制作一个简单的程序,用JNI在Java程序(在Windows机器上)中调用C代码进行测试,但我得到了一个不满意的链接错误 错误:Java 不满意的链接错误ClassName.methodName()V,java,linker,java-native-interface,Java,Linker,Java Native Interface,我正在制作一个简单的程序,用JNI在Java程序(在Windows机器上)中调用C代码进行测试,但我得到了一个不满意的链接错误 错误: $ ls HelloWorld.class HelloWorld.h HelloWorld.java ctest.c ctest.dll $ java HelloWorld Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.helloFromC()V at
$ ls
HelloWorld.class HelloWorld.h HelloWorld.java ctest.c ctest.dll
$ java HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.helloFromC()V
at HelloWorld.helloFromC(Native Method)
at HelloWorld.main(HelloWorld.java:9)
HelloWorld.java
public class HelloWorld {
native void helloFromC();
static {
System.loadLibrary("ctest");
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.helloFromC();
}
}
c测试
#include <jni.h>
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) {
printf("Hello from C!\n");
}
#包括
#包括
JNIEXPORT void JNICALL Java_HelloWorld_helloFromC(JNIEnv*env,jobject jobj){
printf(“来自C的你好!\n”);
}
我生成了头文件
HelloWorld.h
,没有任何问题,因此我编译了HelloWorld.class
,并创建了我的本机库ctest.dll
,但当我尝试运行它时,它抛出了上面提到的错误。加载库时,我尝试使用绝对路径,并在ctest.c
中的本机代码中显式包含头文件。我还尝试过使用带有完全限定路径的System.load()
,但仍然产生相同的错误。在Windows 7机器上使用MinGW编译时,我遇到了这种情况。当我在本文档中发现要成功链接JNI,您需要在参数-Wl,--add stdcall alias中添加一个参数时,它被修复了。
这样地:
gcc-Wl,--add stdcall别名-I“\include”-I“\include\win32”-shared-o hello.dll HelloJNI.c
这将使该符号的别名没有MinGW添加到DLL中的@nn后缀,这样java将识别该方法