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 依赖项。