Java jni 加载 so 失败,提示 Java .lang.UnsatisfiedLinkError: no xxx in Java .library.path

148 天前
 wbd31

项目中把 so 库文件放到了 jar 包里,在 static 代码块中调用如下代码加载 so 库

try (InputStream in = getResource(path)) {
    // 写入 jar classpath 里的 so 文件到外部临时文件
    File temp = new File(TEMP_DIR + name);
    FileUtils.copyInputStreamToFile(Objects.requireNonNull(in), temp);

    String absolutePath = temp.getAbsolutePath();
    Runtime.getRuntime().exec(new String[] {"/bin/chmod", "755", absolutePath});
    log.info("加载企业微信会话存档 SDK LIB 开始, {}", absolutePath);
    System.load(absolutePath);
    log.info("加载企业微信会话存档 SDK LIB 结束, {}", absolutePath);
} catch (Throwable e) {
    log.error("加载企业微信会话存档 SDK LIB, 异常", e);
}

整个方法没有报错,通过 pldd 命令查看也有 /tmp/libWeWorkFinanceSdk_Java.so 的输出

但是调用 native jni 方法的时候仍然报错 java.lang.UnsatisfiedLinkError: no WeWorkFinanceSdk_Java in java.library.path

后面通过设置环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/ 却可以正常工作

这是什么问题 🤔

1441 次点击
所在节点    Java
6 条回复
MoHen9
147 天前
怎么还把 so 拷到 jar 包外面?实在不行就用 JNA 的库调用,JNA 调用特别简单,网上有很多 demo

https://github.com/java-native-access/jna
wbd31
147 天前
@MoHen9 不拷贝到外面,so 文件放到 resources 目录里打成 jar 包之后没法通过 System.load 进来
pagxir
147 天前
system.load(name) 会解释成 libname.so , 至于你填绝对路径会解释成啥就不清楚了。
pagxir
147 天前
既然 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/ 可以正常工作,为啥不用它。
iminto
147 天前
@MoHen9 so 文件必须从 jar 里拷出来再加载,jar 里面的路径属于 url 路径,非物理路径。




@wbd31
iminto
147 天前
估计是加载位置不对,放 static 块里试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1061317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX