[英]UnsatisfiedLinkError with JNI
.h file .h文件
#include <jni.h>
#include "NativePackage_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativePackage_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello world!\n");
return;
}
Java Java
package NativePackage;
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
.c file .c 文件
#include <jni.h>
#include "NativePackage_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativePackage_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello world!\n");
return;
}
I've compiled my.c file using我已经使用编译了 my.c 文件
gcc -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/darwin/ -fPIC -o hello -c HelloWorldImp.c
However, trying to run using java NativePackage/HelloWorld
produce the following error:但是,尝试使用java NativePackage/HelloWorld
运行会产生以下错误:
java -Djava.library.path=NativePackage/ NativePackage/HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at NativePackage.HelloWorld.<clinit>(HelloWorld.java:7)
I'm running on a MAC OS X 10.10我在 MAC OS X 10.10 上运行
Try using 尝试使用
System.load("/home/project/lib/libhello.so");
give the absolute path for the library. 给出图书馆的绝对路径。
that helped me when i had the same problem. 当我遇到同样的问题时帮助了我。
好像事情使用OS X libhello.dylib和-shared选项正确的命名方案的工作。
gcc -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/darwin/ -o libhello.dylib -shared HelloWorldImp.c
For an updated answer for macOS Monterey 12.6.1有关 macOS Monterey 12.6.1 的更新答案
#include <jni.h> // JNI header provided by JDK
#include <stdio.h> // C Standard IO Header
#include "HelloWorld.h" // Generated
// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloWorld_someNativeMethod(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
class HelloWorld {
private native void someNativeMethod();
public static void main(String[] args) {
new HelloWorld().someNativeMethod();
}
static {
// must be word between lib and .dylib, e.g. libMyNative.dylib
System.loadLibrary("MyNative");
}
}
# compile java - generates HelloWorld.h and HelloWorld.class
javac -h . HelloWorld.java
# compile native c files
gcc -I "$JAVA_HOME/include" -I "$JAVA_HOME/include/darwin" -dynamiclib -o libMyNative.dylib -shared HelloWorld.c
# run all
java -Djava.library.path=. HelloWorld
Tested on macOS Monterey 12.6.1在 macOS Monterey 12.6.1 上测试
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/amazon-corretto-17.jdk/Contents/Home
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.