我正在尝试将JNI与C ++一起使用。我可以在this教程之后创建一个Hello-World JNI项目。
但是,我想在我的C ++函数中使用JSON for modern 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;
}
其他信息:
我正在使用带有cygwin64的Windows 10。
我用这个命令编译我的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运行)
答案 0 :(得分:1)
尝试从命令中删除hpp,
x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp
如果错误仍然存在,请使用Dependency Walker检查DLL依赖项。