java.lang.UnsatisfiedLinkError dll.HelloJNI.sayHello () V

При вызове dll из java я получал эту ошибку

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.

я использую компилятор gcc для создания dll

для MinGWC я использую

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.
#

person Bala    schedule 09.10.2013    source источник
comment
Также покажите исходный код DLL.   -  person Joni    schedule 09.10.2013
comment
Не помещайте свои собственные двоичные файлы в каталоги других людей.   -  person user207421    schedule 09.10.2013


Ответы (3)


Вы добавили имя пакета с момента создания кода C. Имя пакета теперь dll, но когда вы его сгенерировали, его не было. Повторите и соответствующим образом скорректируйте свой код C, чтобы он соответствовал новому файлу .h.

person user207421    schedule 09.10.2013

Удалите printf и вместо него попробуйте вернуть какое-то значение или строку из вашего файла cpp и попробуйте распечатать его из файла java.

person user80942    schedule 25.11.2014
comment
Как изменение содержимого метода повлияет на то, будет ли метод вообще найден? A: не будет. - person user207421; 04.06.2020

попробуйте скомпилировать с помощью 64-битного компилятора, например "x86_64-w64-mingw32-g ++". Та же ошибка произошла у меня, и теперь ошибка исправлена ​​...

Причина в том, что либо на вашем компьютере может быть запущен другой экземпляр java, либо архитектура системы не соответствует вашему собственному коду. Попробуйте изменить это и посмотрите, работает ли это.

person THE KING    schedule 06.07.2018
comment
Добро пожаловать в Stack Overflow. Не могли бы вы предоставить более подробное объяснение и ссылки, подтверждающие ваш ответ? - person ggorlen; 04.08.2018
comment
Причина ошибки была указана почти семь лет назад, и это не так. - person user207421; 04.06.2020
comment
Ты не прав. Это было не 7 лет, это было 6 лет и 7 месяцев. @ user207421 - person THE KING; 04.06.2020