JNI在C ++中使用.hpp库

时间:2018-05-18 15:13:08

标签: java c++ java-native-interface cygwin

我正在尝试将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运行)

1 个答案:

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