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());
}
我试图 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());
}