JNI 在 C++ 中使用 .hpp 库
JNI use .hpp library inside C++
我正在尝试将 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;
}
附加信息:
我正在使用 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)
尝试从您的命令中删除 hpp,
x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp
如果错误仍然存在,请使用 Dependency Walker 检查 DLL 依赖项。
我正在尝试将 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;
}
附加信息:
我正在使用 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)
尝试从您的命令中删除 hpp,
x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp
如果错误仍然存在,请使用 Dependency Walker 检查 DLL 依赖项。