Я пытаюсь использовать 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 внутри моего рабочего каталога)