代码之家  ›  专栏  ›  技术社区  ›  Gazouu

JNI使用。C中的hpp库++

  •  0
  • Gazouu  · 技术社区  · 6 年前

    我正在尝试将JNI与C++结合使用。我能够创建一个Hello World JNI项目 this 辅导的

    但是,我想用 JSON for modern 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。水电站 .当我删除这个函数时,一切都很好。C++程序也可以作为独立程序成功运行。

    你好。爪哇:

    public class HelloJNI {
       static {
          System.loadLibrary("hello"); 
       }
    
       private native void sayHello();
    
       public static void main(String[] args) {
          new HelloJNI().sayHello();  // invoke the native method
       }
    }
    

    你好。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提供的缺少的库,但仍然得到了相同的错误。(是的,我在workdir中运行.dll)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alex Cohn    6 年前

    尝试从您的命令中删除hpp,

    x86_64-w64-mingw32-g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.cpp
    

    如果错误仍然存在,请使用 Dependency Walker .