如何在64位Android-L平台上使用32位本机库

Mer*_*mad 9 64-bit android-ndk android-source android-5.0-lollipop

我有一个Android应用程序,我用AOSP(Kitkat)编译为android系统应用程序,它运行正常.我的应用程序依赖于使用Android-NDK编译为32位库的本机代码.我在我的android应用程序libs/armeabi文件夹中复制本机库,然后在AOSP中构建我的android应用程序(我还修改了device.mk以复制/ system/lib文件夹中的libs ).在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");
        }
Run Code Online (Sandbox Code Playgroud)

当我使用AOSP构建代码时,ENABLE_ANDROID_INTEGRATION

更有趣的是,当我关闭ENABLE_ANDROID_INTEGRATION并在Eclipse中构建我的应用程序时,在AOSP之外作为普通的"可下载"应用程序,然后我的应用程序在64位Android平台上正常运行.

我想知道的是 - 如何构建我的应用程序作为64位Android平台的32位库(即AOSP构建)的本机android系统应用程序?

我试过的 - 我在我的Android应用程序的Android.mk文件中使用了LOCAL_32_BIT_ONLY = true标志,但它接缝它没用.可能是我不完全了解这个标志的使用.

因为我的时间不多了所以我更喜欢在这里发布这个问题而不是RnD.如果有人遇到这个问题,请指导.

此致,Meraj

mst*_*sjo 9

它作为第三方应用程序安装时的工作原理是,在安装时,包管理器会扫描APK并检查它是否使用本机库,如果找到它,它会存储它们使用的ABI(因为它只安装库)对于一个单一的ABI,所以关于做出哪个选择的信息需要存储在某个地方).

对于使用/ system/lib中的库安装在系统范围内的应用程序,不清楚此特定应用程序是否依赖于/ system/lib中的某些特定于应用程序的库(在/ system /中的64位版本中不可用) lib64),因此包/应用程序管理器无法知道此特定应用程序需要特定的ABI,因此以64位模式运行它.

设置LOCAL_32_BIT_ONLY可能只影响它是否应该以32位模式编译,而不是应该以哪种方式运行.

http://www.slideshare.net/hidenorly/investigation-result-on-64-bit-support-in-aosp上的一份旧的(可能是过时的)报告似乎表明应用程序的本机库应该进入/ system/lib/apkname,但在实际的Android 5.0系统上似乎不是这样.相反,libs似乎在/ system/app/appname/lib/abiname中.有些应用程序似乎有多个体系结构的本机库(例如,"arm"和"arm64"都是abiname),而其他应用程序只有一个体系结构(这会强制进程在ABI模式下启动).

所以我认为你需要改变你如何安装你的本机库的机制(你说你手动修改了device.mk) - 我不熟悉如何构建自己的应用程序作为AOSP构建的一部分,但我建议试图查看现有的捆绑应用程序他们是如何做到的,这个提交可能是相关的:https://android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/


小智 5

我有同样的问题,在这里这里找到了答案。 删除所有64位库,只保留32位库:在Android.mk中:

APP_API := armeabi armeabi-v7a x86 mips
Run Code Online (Sandbox Code Playgroud)

在build.gradle(Module:app)中:

ndk {
    moduleName "<module_name>"
    abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
Run Code Online (Sandbox Code Playgroud)