linux 上 64 位架构的 JNI 库名称
Posted
技术标签:
【中文标题】linux 上 64 位架构的 JNI 库名称【英文标题】:JNI library name for 64 bit architecture on linux 【发布时间】:2015-03-19 22:10:26 【问题描述】:我为 java 桌面开发了一个 JNI 动态库。目前它适用于 MacOS 和 Windows,但在 Linux 上我有一个奇怪的行为。
我已经为 32 位和 64 位编译了库,但是当我只放置 64 位库并调用 System.loadLibrary (myLibrary);
时,它无法找到它,但是在 32 位架构中,当我只添加 32 位时它能够找到它(我将其命名为 libMyLibrary.so)。
所以我的问题是,对于 32 位,我需要将其命名为 libMyLibrary.so
,但它应该如何命名为 64 位架构?我应该编写一些代码来根据架构加载适当的库吗?
谢谢!
【问题讨论】:
名字无关紧要。可能是别的东西——你也许可以用strace
追踪问题?
你说得对,我犯了一个非常愚蠢的错误 :) 谢谢
出了什么错误?它可能会帮助下一个人。
错误是我有一个错误的“if”并最终调用 system.load 而不是 System.loadLibrary (libName);
【参考方案1】:
标准解决方案是将 32 位和 64 位版本(以及其他体系结构)放在不同的目录中,并确保 java.library.path 指向正确的目录。
【讨论】:
【参考方案2】:您的 JVM 应该加载哪个版本的库取决于代码运行的 JVM 版本以及操作系统架构。 32 位 JVM 应该加载 32 位库,64 位应该加载 64 位库。
我有安装了两个 JVM 的 Ubuntu 64 位操作系统。一个是64位
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
另一个是 32 位
$ /opt/jdk1.7.0_72/bin/java -version
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) Server VM (build 24.72-b04, mixed mode)
我使用以下代码为在不同 JVM 中运行的应用加载库。
static
if (System.getProperty("os.name").equals("Linux"))
if (System.getProperty("os.arch").equals("i386"))
System.out.println("loading i386 library");
else if (System.getProperty("os.arch").equals("amd64"))
System.out.println("loading x86_64 library");
【讨论】:
以上是关于linux 上 64 位架构的 JNI 库名称的主要内容,如果未能解决你的问题,请参考以下文章
Linux /usr/bin/ld:skipping incompatible 解决办法
错误记录Google Play 上架报错 ( 此版本不符合 Google Play 关于提供 64 位版本应用的要求。| 如果提供 x86 架构动态库则必须提供 x86_64 架构的动态库 )