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

3
我正在为Android 6及更高版本创建一个遗留应用程序。 我需要包含一些针对“armeabi”架构构建的.so文件。 我没有这些共享对象的源代码,因此无法为其他架构构建这些对象。
目标设备的架构是“armeabi-v7a”和“arm64-v8a”。 这两个设备都可以运行“armeabi”本地二进制文件,我已经使用adb测试过 (如何在android设备上查找ARM处理器版本?)。
.so文件在"/app/src/main/jniLibs/armeabi/****.so"中,但是我在运行时遇到“JNI: Unsatisfied Link Error”,因此它没有使用它们。
我如何强制设备使用这些文件,尽管它们未经优化,但这是我唯一可以访问的文件。
感谢您的任何帮助。
我使用Android Studio 2021、Gradle 7、minSdkVersion 21、targetSdkVersion 31、compileSdkVersion 31。

首先,您应该检查.so文件是否实际包含在APK中。由于armeabi支持已经过时,构建工具可能会忽略它们。如果您的应用程序包括为armeabi-v7a或arm64-v8a构建的任何.so文件,则可能必须删除这些文件;否则,Android可能会对要使用哪个.so文件感到困惑。 - Michael
非常感谢您的回答。提取的APK包括armeabi目录中的.so文件。这是lib文件夹中唯一的目录。如果我将该目录重命名为“armeabi-v7a”,它可以在旧设备上运行。但是,如果我将其重命名为“arm64-v8a”,另一个设备会认为libs是64位的,但实际上是32位的。我的问题是,设备没有查找“armeabi”目录。 - Jan Knoblauch
2个回答

2

终于解决了问题!经过数天的绝望,我通过将Gradle从7.1.2降级到3.2.0使其正常工作。

旧版本的Gradle日志:

由于缺少ABI“ARMEABI”的剥离工具,无法剥离库“.....\app\build\intermediates\transforms\mergeJniLibs\debug\0\lib\armeabi\lib.so”。直接打包。

然后所有设备,包括64位设备,都选择“armeabi”库。

通过在app\build.gradle中设置android.defaultConfig.ndk { abiFilters 'armeabi' },也可以在Gradle 7下运行。


我有一个类似的问题。这允许armeabi jniLibs,但似乎不允许混合使用armeabi和armeabi-v7a libs。我已将“armeabi-v7a”添加到android.defaultConfig.ndk.abiFilters列表中,但原始问题仍然存在。 - ReubenBeeler
抱歉,我不知道如何混合不同的库类型 - 如果可能的话。 - Jan Knoblauch
一切都好。我曾担心将armeabi库放入armeabi-v7a文件夹中会导致问题,但事实证明没有问题。armeabi库只是不能利用较新CPU中的FLOP硬件(应使用armeabi-v7a库),因此速度可能略慢于最佳状态。 - ReubenBeeler

0

如果您的应用程序中没有其他本地库(也称为共享对象),则应该能够将/app/src/main/jniLibs/armeabi目录重命名为armeabi-v7a,并在32位和64位设备上运行APK。但请记住,您不能在Play商店上发布这样的应用程序:Google现在要求所有应用程序都使用64位构建。


1
我会尝试这个! - Jan Knoblauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接