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

Android ndk 如何在64位Android-L平台上使用32位本机库,android-ndk,64-bit,android-5.0-lollipop,android-source,Android Ndk,64 Bit,Android 5.0 Lollipop,Android Source,我有一个Android应用程序,我用AOSP(Kitkat)编译它作为Android系统应用程序,它运行良好。我的应用程序依赖于使用androidndk作为32位库编译的本机代码。我正在我的android应用程序libs/armeabi文件夹中复制本机库,然后在AOSP中构建我的android应用程序(我还修改了device.mk,将我的libs复制到/system/lib文件夹中)。Android Kitkat上的一切都很好 当我将应用程序移植到Android-L(64位平台)上时,我无法从A

我有一个Android应用程序,我用AOSP(Kitkat)编译它作为Android系统应用程序,它运行良好。我的应用程序依赖于使用androidndk作为32位库编译的本机代码。我正在我的android应用程序libs/armeabi文件夹中复制本机库,然后在AOSP中构建我的android应用程序(我还修改了device.mk,将我的libs复制到/system/lib文件夹中)。Android Kitkat上的一切都很好

当我将应用程序移植到Android-L(64位平台)上时,我无法从Android应用程序加载本机库,错误如下-

java.lang.UnsatisfiedLinkError:dlopen失败:“libfoobar.so”是32位而不是64位的

我使用以下java代码加载本机库-

        if ( ENABLE_ANDROID_INTEGRATION )
        {
            System.load("/system/lib/libfoobar.so");
        }
        else
        {
            System.loadLibrary("foobar");
        }
当我使用AOSP构建代码时,启用安卓集成

更有趣的是,当我关闭启用安卓集成并在Eclipse中构建我的应用程序,在AOSP之外作为一个普通的“可下载”应用程序时,我的应用程序在64位安卓平台上运行良好

我想知道的是,如何将我的应用程序构建为一个本地android系统应用程序,并为64位android平台提供32位库(即AOSP构建)

我尝试过的-我在我的android应用程序的android.mk文件中使用了LOCAL\u 32\u BIT\u ONLY=true标志,但它没有用。可能是我没有完全意识到这个标志的使用

因为我的时间不多了,所以我更喜欢在这里集体发帖,而不是RnD。如果有人面临这个问题,请指导

问候,,
Meraj

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

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

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

位于的一份旧的(可能已经过时)报告似乎建议应用程序的本机库应该放在/system/lib/apkname中,但在实际的Android 5.0系统上似乎不是这样。相反,libs似乎放在/system/app/appname/lib/abiname中。一些应用程序似乎有多个体系结构的本机libs(例如,“arm”和“arm64”作为abiname),而其他的只有一个架构(这将强制在该ABI模式下启动进程)

因此,我认为您需要改变安装本机库的机制(您说您手动修改了device.mk)-我不熟悉如何作为AOSP构建的一部分构建自己的应用程序,但我建议尝试查看现有捆绑应用程序的实现方式,这可能与此相关:

在你的Android.mk中试试这个
LOCAL_MULTILIB:=32

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

APP_API := armeabi armeabi-v7a x86 mips
内置.gradle(模块:应用程序):

ndk{
模块名称“”
abiFilters“armeabi”、“armeabi-v7a”、“x86”、“mips”
}

感谢您提供的这些信息。它帮助我朝着正确的方向前进。您好@MerajAhmad,我也面临着类似的问题,您能描述一下您是如何做到的吗?谢谢您事实上,这只是ABI过滤器“armeabi”、“armeabi-v7a”、“x86”、“mips”“部分,再加上gradle.properties中的android.useDeprecatedNdk=true似乎就足够了。这是真的,但现在如果你在应用程序中没有使用64位libs,谷歌游戏控制台将抛出一个错误
ndk {
    moduleName "<module_name>"
    abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}