java.lang.UnsatisfiedLinkError dll.HelloJNI.sayHello()V 错误信息:java.lang.UnsatisfiedLinkError dll.HelloJNI.sayHello()V。

3
当我从Java调用一个dll时,出现了这个错误。
Exception in thread "main" java.lang.UnsatisfiedLinkError: dll.HelloJNI.sayHello()V
at dll.HelloJNI.sayHello(Native Method)
at dll.HelloJNI.main(HelloJNI.java:7)

这是我的Java代码

 public class HelloJNI {  
 public static void main(String[] args) {
     HelloJNI h = new HelloJNI(); 
     h.sayHello();  // invoke the native method
   }

 static {
     try{
         System.load("D://Program Files//Java//jdk1.7.0_40//bin//hello.dll"); // hello.dll (Windows) or libhello.so (Unixes) 
     }
     catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load.\n" + e);
          System.exit(1);
        }

   }
   private native void sayHello();

}

这是我的用于dll的c代码。
我使用gcc编译器生成dll。
对于MinGW,我使用以下命令:
gcc -Wl,--add-stdcall-alias -I"\include" -I"\include\win32" -shared -o hello.dll HelloJNI.c
#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

我已经移除了包中的dll文件,但在执行时出现了以下错误。
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x610d70b4, pid=1720, tid=1160
#
# JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43)
# Java VM: Java HotSpot(TM) Client VM (24.0-b56 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [cygwin1.dll+0xd70b4]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

同时显示动态链接库的源代码。 - Joni
不要将你自己的二进制文件放到别人的目录中。 - user207421
3个回答

3

在生成C代码之后,你添加了一个包名称。包名称现在是dll,但在你生成它时,还没有。重新进行调整你的C代码,以便与新的.h文件相符合。


-1

移除printf,尝试从你的cpp文件返回一些值或字符串,并尝试从java文件中打印它。


更改方法的内容会如何影响方法是否被找到?答案是不会。 - user207421

-1

尝试使用64位编译器进行编译,例如"x86_64-w64-mingw32-g++"。我遇到了同样的错误,但现在已经修复了...

原因可能是你的计算机上正在运行另一个Java实例,或者系统架构与本地代码不匹配。尝试更改并查看是否有效。


欢迎来到 Stack Overflow。您能否提供更详细的解释和支持您答案的参考资料? - ggorlen
错误的原因在近七年前已经说明,但这不是它。 - user207421
你错了,不是7年,而是6年7个月。@user207421 - apgautham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接