JNI - 找不到本机库

时间:2014-10-30 16:15:01

标签: java java-native-interface

我有一个C ++本机库的JNI包装器。当我尝试在我的Java代码中加载库时,我看到以下异常:

java.lang.UnsatisfiedLinkError: no Foo in java.library.path

我像这样加载库:

System.loadLibrary("Foo");

我将java.library.path设置如下:

java.library.path = /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/lib

我将-XshowSettings:properties添加到JVM选项中,并确认java.library.path的设置如上所示。

这是文件系统上的库.so:

$ l /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/lib/libFoo.so 
-rwxr-xr-x  1 root  wheel   448K 29 Oct 14:23 /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/lib/libFoo.so

环境信息:

java.version = 1.7.0_40
os.arch = x86_64
os.name = Mac OS X
os.version = 10.10

那为什么我不能加载库?

2 个答案:

答案 0 :(得分:1)

将.so文件放在jni / libs文件夹中。如果您有多个平台的库,则需要为每个平台创建一个文件夹并放置相应的文件。例如,jni / libs / x86将具有为x86平台构建的.so文件。如果您使用的是Android Studio,则与此略有不同。

答案 1 :(得分:1)

在Mac OS X上,JDK不会搜索以.so结尾的文件或.dylib.jnilib以外的任何文件的路径。我们需要确保本地库的文件名以.dylib.jnilib结尾。

参考:https://developer.apple.com/library/mac/documentation/Java/Conceptual/Java14Development/05-CoreJavaAPIs/CoreJavaAPIs.html