JNI UnsatisfiedLinkError: сбой процедуры инициализации библиотеки динамических ссылок (DLL) - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь вызвать функцию из c ++ через JNI.Я следовал инструкциям, которые нашел в Интернете, и все еще получаю исключение:

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: \ path \ to \ dll \ remoteAPI.dll: библиотека динамических ссылокСбой процедуры инициализации (DLL)

Путь к файлу DLL правильный, и он там находится.Я добавил путь через VMOptions в IntelliJ через: -Djava.library.path = \ path \ to \ dll

Так почему я все еще получаю исключение?Очевидно, это исключение генерируется, когда DllMain возвращает значение false.Но нужен ли он мне здесь или есть библиотека jni, и если мне нужно ее реализовать, куда мне ее поместить?

entity_remoteAPI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class entities_remoteAPI */

#ifndef _Included_entities_remoteAPI
#define _Included_entities_remoteAPI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     entities_remoteAPI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_entities_remoteAPI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

entity_remoteAPI.cpp

#include <jni.h>
#include "entities_remoteAPI.h"


JNIEXPORT void JNICALL Java_entities_remoteAPI_sayHello
  (JNIEnv* env, jobject thisObject) {

}

App.java

public class App 
{
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );

        System.loadLibrary("remoteAPI");

        RemoteAPI ai = new RemoteAPI();
        ai.sayHello();
    }
}

entity / RemoteAPI.java

package entities;

public class RemoteAPI {
    public native void sayHello();
}

1 Ответ

0 голосов
/ 26 сентября 2019

Я теперь избавился от исключения, скомпилировав dll из командной строки вместо использования IDE Code :: Blocks .Команды, которые я использовал, где

g ++ -c -I% JAVA_HOME% \ include -I% JAVA_HOME% \ include \ win32 entity_RemoteAPI.cpp -o entity_RemoteAPI.o

и

g ++ -shared -o remoteAPI.dll entity_RemoteAPI.o -Wl, - add-stdcall-alias

Очевидно, это как-то связано с параметрами кода:: Блоки проходит при построении DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...