本文将介绍如何解决JNA兼容性问题,在 Android 开发中,使用 JNA库可以轻松调用本机代码,无需编写 JNI代码。会遇到本机库兼容性问题,尤其是在不同版本的 JNA 库之间以及 32 位/64 位库的冲突。
问题描述
我遇到了两个主要问题:
-
JNA 库版本不兼容:
java.lang.Error: There is an incompatible JNA native library installed on this system Expected: 6.1.0 Found: 7.0.0
-
32 位和 64 位库的冲突:
java.lang.UnsatisfiedLinkError: Unable to load library 'dmtskf': dlopen failed: ... is 32-bit instead of 64-bit
解决方案步骤
步骤 1: 下载和配置正确版本的 JNA 库
确保使用的 JNA 库版本与预期一致。可以从 git hub 仓库下载 JNA 6.1.0 库。
下载 jna-5.9.0\jna-5.9.0\dist\android-aarch64.jar
改.zip 并解压出libjnidispatch.so并将其添加到项目的libs\arm64-v8a中。
在 build.gradle
文件中添加下载的 JNA 依赖
步骤 2: 确认 JNI 库文件的位置
确保 libjnidispatch.so
文件存在于 src/main/jniLibs
目录下,并且架构目录结构正确:
app/
└── libs/
├── arm64-v8a/
│ └── libjnidispatch.so
├── armeabi-v7a/
│ └── libjnidispatch.so
├── armeabi/
│ └── libjnidispatch.so
└── x86/
└── libjnidispatch.so
步骤 3: 解决 32 位和 64 位库冲突
确保所有本机库文件与目标设备的架构匹配。如果在 64 位设备上运行应用程序,请确保所有库都是 64 位的。以下是确保 64 位库的方法:
-
确认库文件架构:
确保src/libs/arm64-v8a/
目录下包含 64 位版本的libdmtskf.so
文件。 -
更新
build.gradle
文件:
确保abiFilters
包含 64 位架构:
defaultConfig {
applicationId "com.xxx.dmt_skf_api"
minSdk 24
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
//设置支持的SO库架构
// abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
ndkVersion "21.4.7075529"
}
通过这些步骤,你应该能够解决 JNA 库版本不兼容和 32 位/64 位库冲突的问题