Java JNI与不满意链接错误

Java JNI与不满意链接错误,java,c,java-native-interface,Java,C,Java Native Interface,我正在使用JNI执行我的第一步,并尝试编写一个简单的Hello Java程序,但由于以下错误而失败: Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloJava.dostuff()V at HelloJava.dostuff(Native Method) at HelloJava.main(HelloJava.java:12) 这是我的Java类: class HelloJava {

我正在使用JNI执行我的第一步,并尝试编写一个简单的Hello Java程序,但由于以下错误而失败:

Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloJava.dostuff()V
        at HelloJava.dostuff(Native Method)
        at HelloJava.main(HelloJava.java:12)
这是我的Java类:

class HelloJava {
    private native void dostuff();
    static {
        System.loadLibrary("HelloJavaDLL");
    }

    public static void main(String[] args) {
        System.out.println("This is from java.");
        HelloJava j = new HelloJava();
        j.dostuff();
    }
}
HelloJava.c是使用
javah-jni-HelloJava
生成的

C实现如下所示:

#include <stdio.h>
#include <jni.h>
#include "HelloJava.h"

JNIEXPORT void JNICALL Java_HelloJava_dostuff
  (JNIEnv *env, jobject this)
{
    printf("And this comes from C ! :)\n");
}
#包括
#包括
#包括“HelloJava.h”
JNIEXPORT void JNICALL Java\u HelloJava\u dostuff
(JNIEnv*env,jobject this)
{
printf(“这来自C!:)\n”);
}
我在Windows上使用gcc将其编译为共享库(.dll)

现在运行Java.class文件时,出现上述异常您能告诉我出现此错误的原因吗?

顺便问一下,你能告诉我如何用C++ +J/NP>使用JNI吗? 更新 也许你想自己试试?我真的找不到这个问题。这里有一个链接,您可以从中下载一个包含所有文件(已编译文件)的.zip文件

服务器重试了所有操作,但仍然是同一问题。
以下是我所做的步骤:

  • 编写Hello.java
  • 使用
    javac Hello.java
  • 使用
    javah-jni Hello
  • 编写Hello.c文件
  • 使用
    gcc Hello.c-shared-o Hello.dll-I“c:\Java\jdk1.7.0\include”-I“c:\Java\jdk1.7.0\include\win32”
  • 使用
    java Hello
  • 谢谢

    解决方案 根据这里的说明,在gcc命令中添加
    -Wl,--kill at
    可以解决问题。
    感谢A.H.的帮助

    请检查:

    • 库的文件名是
      HelloJavaDLL.dll
      (在Windows上)
    • DLL的目录位于库搜索路径(即
      path
      环境变量)中,或者通过
      -Djava.library.path=C:\WhereEverItIs
      提供给
      java

    第二个问题:JNI支持C和C++的直接对话。如果您查看生成的头文件和

    jni.h
    文件,您将看到这一点。

    请提供准确的gcc命令行以及
    java-version
    的输出。您是否查看了将标题键入“搜索”框的3500多个结果?我愿意你在那里找到答案:+1,比我的答案更完整。我要把我的拿走。没错,在本地方法的定义中可以使用C++代码,并且可以在C++代码中使用JNI函数。1。是,库的名称正确,2。我不认为找不到库不是问题,删除.dll文件会导致另一个不满意的链接错误,消息是:library HelloJavaDLL不在java.library.path中,但我会检查它,谢谢。因此,关于GCC的确切编译器参数的问题就出现了。可能存在一些开关,这些开关会影响默认情况下GCC使用的ABI/调用约定。Windows也有一些……这是完整的gcc命令:
    gcc HelloJava.c-I“c:\Program Files(x86)\Java\jdk1.7.0\include“-I”c:\Program Files(x86)\Java\jdk1.7.0\include\win32“-o HelloJavaDLL.dll-shared
    编译后,我只运行
    Java HelloJava
    。谢谢你肯定不是因为图书馆没找到。