Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在64位Android设备上使用32位本机库_Android_Android Ndk_Ndk Build - Fatal编程技术网

如何在64位Android设备上使用32位本机库

如何在64位Android设备上使用32位本机库,android,android-ndk,ndk-build,Android,Android Ndk,Ndk Build,我在应用程序中使用一个本机库,该库仅针对armeabi、armeabi-v7a和x86编译 当此库加载到64位设备(如三星S6)上时,应用程序会因未满足的链接错误而崩溃 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2

我在应用程序中使用一个本机库,该库仅针对armeabi、armeabi-v7a和x86编译

当此库加载到64位设备(如三星S6)上时,应用程序会因未满足的链接错误而崩溃

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
    at java.lang.Runtime.loadLibrary(Runtime.java:366)
    at java.lang.System.loadLibrary(System.java:989)

不幸的是,这个库是封闭源代码的。有没有办法在不重新编译64位目标库的情况下修复此问题?

在Android上安装APK时,系统会在APK的
lib
文件夹中查找本机库目录(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips64、mips),按照
Build.SUPPORTED\u ABIS
确定的顺序

如果您的应用程序恰好有一个
arm64-v8a
目录缺少libs,那么缺少的libs将不会从另一个目录安装,libs不会混合。这意味着您必须为每个体系结构提供全套库

因此,为了解决您的问题,您可以从构建中删除64位lib,或者将abiFilters设置为仅打包32位体系结构:

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

上面的答案将有助于生成仅使用32位而不是64位的构建。如果您使用的是[ABI过滤器“armeabi”、“armeabi-v7a”、“x86”、“mips”]。生成有符号apk意味着,这不是64位的。当我们上传到Google Play商店时,会出现一个错误。它不是64位版本。

您看过和吗?我看过。一个应用于AOSP,另一个应用于动态类加载。我的情况实际上要简单得多。但我刚刚发现,我包含的另一个本机库确实提供了64位.so文件,因此在最后一个apk中的my/lib文件夹中有一个arm64-86文件夹。可能这就是为什么系统假设我在所有情况下都提供64位.so文件。我将尝试仅使用32位支持重新编译这个库,看看它是否有效。好主意。让我们知道(如果需要,回答您自己的问题)。看起来不错,64位文件夹随此片段一起消失。一旦找到64位手机,我会将答案标记为已接受,以复制设置错误。当前插件中不推荐NDK集成。考虑尝试新的实验插件。添加<代码> Android。使用UpDebug RealNDK=真/<代码>到一个名为GealLe.Projts的文件,在项目的根目录下。顺便说一句,使用不推荐的集成也不必感到不快,因为使用abiFilters仍然是atm从APK中过滤出64位LIB的最干净的方法。从今天(2019年8月1日)起,如果没有64位体系结构,您无法向Google Play Store提交APK。