JNI использует библиотеку .hpp внутри C ++ - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь использовать JNI с C ++.Я могу создать проект Hello-World JNI, следуя этому учебнику.

Но я хочу использовать JSON для современного C ++ внутри моей функции C ++.Эта библиотека содержит только файл json.hpp, который я включаю в свой проект.Все хорошо компилируется, у меня есть hello.dll файл, но когда я запускаю свое Java-приложение, я получаю эту ошибку:

$ java HelloJNI java.lang.UnsatisfiedLinkError: C:\Users\Levio-CIL\Desktop\TEST\hello.dll: Can't find dependent libraries
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at HelloJNI.<clinit>(HelloJNI.java:3) Exception in thread "main"

Я провел несколько тестов, и кажется, что .dll не может найтифункция внутри json.hpp.Когда я удаляю эту функцию, все работает хорошо.Программа на C ++ также может успешно работать как отдельная.

HelloJNI.java:

public class HelloJNI {
   static {
      System.loadLibrary("hello"); 
   }

   private native void sayHello();

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

HelloJNI.cpp:

#include <jni.h>
#include "HelloJNI.h"
#include "json.hpp"

using json = nlohmann::json;

// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {

    json specific_data = json::parse("{\"id\": \"aa\",\"value\": 1,\"type\": \"water\"}"); //THE PROBLEMATIC LINE
    printf("Hello world");
    return;
}

Дополнительная информация:

Я использую Windows 10 с cygwin64.

Я компилирую свой файл c ++ с помощью этой команды:

x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp json.hpp

Каждый файл находится в одном каталоге.

РЕДАКТИРОВАТЬ: Я включил отсутствующую библиотекупредоставлен Dependency Walker, но все равно получил ту же ошибку.(И да, я запускаю с .dll внутри моего рабочего каталога)

1 Ответ

0 голосов
/ 18 мая 2018

Попробуйте удалить hpp из вашей команды,

x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp

Если ошибка не устранена, проверьте зависимости DLL с помощью Dependency Walker .

...