java调用.lib_Java调用C++库

在尝试使用Java调用名为libhello的C++动态库时遇到`UnsatisfiedLinkError`。问题源于Mac系统下库文件名应为libhello.dylib而非libhello.so。通过修改makerun.sh脚本并将java.library.path设置为当前目录解决了问题。分析了JDK源码,了解不同操作系统下库文件名的处理方式。
摘要由CSDN通过智能技术生成

问题

报错

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)

at java.lang.Runtime.loadLibrary0(Runtime.java:870)

at java.lang.System.loadLibrary(System.java:1122)

at HelloJNI.(HelloJNI.java:4)

解决

makerun.sh 脚本中生成的 libhello.so 改成 libhello.dylib 即可

原因

一层一层分析

1 . java引用的动态库 libname hello

public class HelloJNI {

static {

System.loadLibrary("hello");

}

......

c++生成的动态库 libhello.so

g++ -std=c++11 -shared -fPIC -I$JAVA_INC -I$JAVA_INC/linux HelloJNIImpl.cpp -o libhello.so

运行java时指定的 java.library.path=.

java -Djava.library.path=. HelloJNI

报错no hello in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)

at java.lang.Runtime.loadLibrary0(Runtime.java:870)

at java.lang.System.loadLibrary(System.java:1122)

at HelloJNI.(HelloJNI.java:4)

很显然,问题是没有在 java.library.path 的路径中 找到 libname 为 hello 的动态库,我们在代码里打印一下 java.library.path 和 实际匹配的 libname,发现path ok,libname 为 libhello.dylib,并非libhello.so;

查看jdk源码发现,jdk对Windows、Mac、Linux操作系统中的 libname 处理各不相同,以前只关注到了 Windows 和 Linux 的区别。

打印变量

public class HelloJNI {

static {

System.out.println(System.getProperty("java.library.path"));

System.out.println(System.mapLibraryName("hello"));

System.loadLibrary("hello");

}

......

输出结果

.

libhello.dylib

jdk源码

// Set the lib prefix and suffix based on the OS

if (osName.startsWith("Windows")) {

libPrefix = "";

libSuffix = ".dll";

} else if (osName.startsWith("Mac")) {

libPrefix = "lib";

libSuffix = ".dylib";

} else if (osName.startsWith("Linux")) {

libPrefix = "lib";

libSuffix = ".so";

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值