Java, C++ JNI - java.lang.UnsatisfiedLinkError : No .dylib in java.library.path

Java, C++ JNI - java.lang.UnsatisfiedLinkError : No .dylib in java.library.path

我试图 link java 和 c++ 代码使用 java JNI 但是当我 运行 使用 dylib 路径的 java 文件时,得到一个没有可用文件的错误。但是,我的 lib 文件在当前工作目录中可用。

此外,我尝试将相同的 dylib 移动到 /Library/Java/Extensions,但仍然出现相同的错误。

Java 文件:JNIJava.java

public class JNIJava {
    static {
        System.loadLibrary("JNI_CPP");
    }
    public native void printString(String name);
   
    public static void main(final String[] args) {
        JNIJava jniJava = new JNIJava();
        jniJava.printString("Invoked C++ 'printString' from Java");
    }
}

头文件:JNIJava.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/include/jni.h"
/* Header for class JNIJava */

#ifndef _Included_JNIJava
#define _Included_JNIJava
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNIJava
 * Method:    printString
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_JNIJava_printString
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

C++ 文件:JNIJava.cpp

#include <iostream>
#include "JNIJava.h"

using namespace std;

JNIEXPORT void JNICALL Java_JNIJava_printString(JNIEnv *env, jobject jthis, jstring string) {
    const char *stringInC = env->GetStringUTFChars(string, NULL);
    if (NULL == stringInC)
        return;
    cout << stringInC << endl;
    env->ReleaseStringUTFChars(string, stringInC);
}

对 link 和 运行 代码使用了以下命令:

javac JNIJava.java -h .

g++ -dynamiclib -O3 \
    -I/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/include \
    -I/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/include \
    JNIJava.cpp -o JNI_CPP.dylib

java -cp . -Djava.library.path=$(pwd) JNIJava

当我做的时候:

JNIJava.class           JNIJava.cpp             JNIJava.h               JNIJava.java            JNI_CPP.dylib

错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no JNI_CPP in java.library.path: /Users/tkapadn/Documents/Documents_Data/Lens-Eclipse-Workspace/Java_JNI/CPP
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2447)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:809)
        at java.base/java.lang.System.loadLibrary(System.java:1893)
        at JNIJava.<clinit>(JNIJava.java:3)

错误截图如下:

enter image description here

注意 - 我尝试使用 JNI linking c 和 java,我成功地 运行 java 文件。

Java版本-jdk1.8.0_261, 系统 - macOS Big Sur (11.6.1)

请提出您的建议。

您对 System.loadLibrary 的调用必须省略文件名的 lib 部分:

        System.loadLibrary("JNI_CPP");

您的 cpp 文件应与头文件相匹配,因此删除函数名称的 com_example_jni_ 部分。

而不是使用 'System.loadLibrary("")' 使用 'System.load("lib path")' 并检查库是否为 working.then 您可以将其移动到 java 库路径。

例如:(已测试且有效)

try { 

String libPath = System.getProperty("user.dir") + System.getProperty("file.separator") + System.mapLibraryName("JNI_CPP"); 
System.load(libPath); 

} catch (Exception e) {
 System.out.println(e.toString());
}