【问题标题】:UnsatisfiedLinkError with JNI使用 JNI 的 UnsatisfiedLinkError
【发布时间】:2014-11-19 02:35:03
【问题描述】:

.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

package NativePackage;

public class HelloWorld {
public native void displayHelloWorld();

static {
    System.loadLibrary("hello");
}

public static void main(String[] args) {
    new HelloWorld().displayHelloWorld();
}
}

.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;
}

我已经使用

编译了我的 .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 

但是,尝试使用 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)

我在 MAC OS X 10.10 上运行

【问题讨论】:

  • 应该是java -Djava.library.path=NativePackage/ NativePackage.HelloWorld。你把“hello”共享库放在哪里了?
  • 在 NativePackage/ 中,我也不确定共享库的命名是否应该只是 hello 或 libhello.so
  • 尝试使用-shared标志编译,Mac OS X上库的命名方案为libXXX.dylib
  • 谢谢 Samuel,你的回答是正确的。

标签: java java-native-interface unsatisfiedlinkerror


【解决方案1】:

尝试使用

System.load("/home/project/lib/libhello.so");

给出库的绝对路径。

当我遇到同样的问题时,这对我有帮助。

【讨论】:

  • 这很好用,但是命名对于 OS X 是不正确的,对于 linux 是这样。另外,我遇​​到了编译问题。
【解决方案2】:

使用 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

【讨论】:

  • .dylib 而不是 Mac 中的 .so
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多