强制 CPU/ABI 在 Android 上使用 armeabi-v7a

Forcing CPU/ABI to armeabi-v7a on Android

我有一个使用一些 JNI 代码的 Android 应用程序。长话短说(双关语),几乎不可能将 JNI 库转换为 64 位,因为这需要进行大量更改。代码(Java 和 JNI)在 armeabi-v7a 架构上运行良好。

正在使用 loadLibrary 加载库。当我尝试在 Nexus 6 上 运行 我的应用程序时,应用程序加载正常。一旦执行 loadLibrary,应用程序就会崩溃并出现 here.

中描述的错误

据我了解,问题是在 Nexus 6 上执行时,应用程序构建为 arm64-8a。但是这些库不是为 arm64-8a 构建的(因为 64 位版本存在我在问题开头提到的问题)。

我的问题是,我可以强制 arm64-8a 设备也使用 运行 armeabi-v7a 代码吗?如何强制我的应用程序 apk 为 armeabi-v7a,以便无论设备如何,它都只有 32 位?

是的,arm64-v8a 设备也可以运行 armeabi-v7a 代码。

安装 APK 时,安装程​​序会检查软件包是否包含官方目录中的库,并根据结果将 activity 标记为 32 位或 64 位。

如果它在 APK 中找到 lib/arm64-v8a 中的库(通常取自构建目录中的目录 libs/arm64-v8a),它将被标记为 64 位,并忽略所有其他目录。如果它在 APK 的 lib/armeabi-v7alib/armeabi 中找到库,则该进程被标记为 32 位。如果其中任何一个都没有本机库,安装程序会假定应用程序根本不使用本机代码,并且可以 运行 在任何一种模式下自由使用,实际上是在 64 位模式下。

现在,如果您确实以 64 位模式运送了一些(但不是全部)库,该过程将以 64 位模式启动并且将无法加载 32 位库(甚至不会安装) .在这种情况下,您必须避免捆绑任何 64 位库,除非它们都可用。

或者您不使用官方 libs 目录,而是以其他方式安装您的库(例如,通过在 运行 时间下载它们或将它们保存在例如资产中),系统不知道您的进程想要 运行 32 位模式下的库(此时切换到其他模式为时已晚)。在这些情况下,请确保至少以 normal/official 方式包含一些虚拟库,以便将应用程序标记为 32 位。

有关类似问题的答案,请参阅 , and