我有一个 Android 应用程序,我用 AOSP(Kitkat) 编译为 Android 系统应用程序,并且运行良好。我的应用程序依赖于使用 Android-NDK 作为 32 位库编译的本机代码。我正在我的 Android 应用程序中复制本机库库/armeabi文件夹,然后在 AOSP 中构建我的 Android 应用程序(我还修改了设备.mk将我的库复制到/系统/库文件夹)。 Android Kitkat 上一切正常。
当我将我的应用程序移植到 Android-L(64 位平台)上时,我无法从 Android 应用程序加载我的本机库,错误如下 -
java.lang.UnsatisfiedLinkError: dlopen failed: "libfoobar.so" is 32-bit instead of 64-bit
我正在使用以下 java 代码来加载本机库-
if ( ENABLE_ANDROID_INTEGRATION )
{
System.load("/system/lib/libfoobar.so");
}
else
{
System.loadLibrary("foobar");
}
当我使用 AOSP 构建代码时启用安卓集成 is true
更有趣的是当我关闭时启用安卓集成并在 Eclipse 中构建我的应用程序,在 AOSP 之外作为普通的“可下载”应用程序,然后我的应用程序在 64 位 Android 平台上运行良好。
我想知道的是 - 如何将我的应用程序构建为具有 32 位库(这意味着 AOSP 构建)的本机 Android 系统应用程序,适用于 64 位 Android 平台?
我尝试过的 - 我用过LOCAL_32_BIT_ONLY = true在我的 android 应用程序的 Android.mk 文件中标记,但它似乎没有用。可能我不完全了解这个标志的使用。
由于我的时间不多了,所以我更愿意在小组中而不是 RnD 中发布这个问题。如果有人遇到这个问题,请指导。
问候,
梅拉杰
它在作为第三方应用程序安装时工作的原因是,在安装时,包管理器会扫描 APK 并检查它是否使用本机库,如果找到,它会存储它们使用的 ABI(因为它只安装库)对于单个 ABI,因此有关做出哪个选择的信息需要存储在某处)。
对于使用 /system/lib 中的库在系统范围内安装的应用程序,尚不清楚此特定应用程序是否依赖于 /system/lib 中的某些应用程序特定的库(这些库在 /system/ 中的 64 位版本中不可用) lib64),因此包/应用程序管理器无法知道这个特定的应用程序需要特定的 ABI,因此以 64 位模式运行它。
设置 LOCAL_32_BIT_ONLY 可能只影响它是否应该以 32 位模式编译,而不影响它应该以哪种方式运行。
一份旧的(可能已经过时的)报告位于http://www.slideshare.net/hidnorly/investigation-result-on-64-bit-support-in-aosp http://www.slideshare.net/hidenorly/investigation-result-on-64-bit-support-in-aosp似乎建议应用程序的本机库应该进入 /system/lib/apkname,但在实际的 Android 5.0 系统上似乎并非如此。相反,库似乎位于 /system/app/ 中appname/lib/abiname。一些应用程序似乎具有适用于多种架构的本机库(例如“arm”和“arm64”)abiname),而其他的只有一种架构(这将强制进程在该 ABI 模式下启动)。
所以我认为你需要改变如何安装本机库的机制(你说你手动修改了 device.mk) - 我不熟悉如何构建自己的应用程序作为 AOSP 构建的一部分,但我建议尝试查看现有的捆绑应用程序如何执行此操作,此提交可能相关:https://android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/ https://android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)