Java 不满意的链接错误ClassName.methodName()V

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

我正在制作一个简单的程序,用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 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将识别该方法