如何在其他架构上使用 "armeabi" .so 文件?

How to use "armeabi" .so-files on other architectures?

我为 Android 6 及更高版本创建了一个旧版应用程序。 我需要包含一些为“armeabi”架构构建的 .so 文件。 我没有这些共享对象的源代码,所以我无法为其他架构构建它们。

目标设备的架构是“armeabi-v7a”和“arm64-v8a”。 两种设备都可以 运行 用于“armeabi”的本机二进制文件,我已经使用 adb (How to find ARM processor version on android device?) 进行了测试。

.so 文件位于“/app/src/main/jniLibs/armeabi/****.so”中,但我在 运行 期间收到“JNI:未满足 Link 错误”,所以它没有使用它们。

我怎样才能强制设备使用这些文件,虽然它们没有针对 运行时间进行优化,但是我可以访问的唯一文件。

感谢您的帮助。

我用的是AndroidStudio 2021,Gradle7,minSdkVersion 21,targetSdkVersion 31,compileSdkVersion 31

您应该能够将 /app/src/main/jniLibs/armeabi 目录重命名为 armeabi-v7a 并在 32 位和 64 位设备上安装 APK 运行,如果您没有您应用中的其他本机库(a.k.a. 共享对象)。但请记住,您不能在 Play 商店中发布此类应用:Google 现在需要所有应用的 64 位版本。

我终于解决了这个问题!经过几天的绝望,我通过将 Gradle 从 7.1.2 降级到 3.2.0 来让它工作。

旧 Gradle 版本日志:

由于缺少 ABI 'ARMEABI' 的剥离工具,无法剥离库 '.....\app\build\intermediates\transforms\mergeJniLibs\debug[=22=]\lib\armeabi\lib.so'。按原样打包。

然后所有设备,也是 64-bit-devices,选择“armeabi”-libraries。

通过在app\build.gradle中设置android.defaultConfig.ndk { abiFilters 'armeabi' },它也适用于Gradle 7.