Android NDK – 使用gradle支持multlib

我的问题是针对64位Android系统的原生Android开发。

我正在寻找一种方法,使用gradle构建系统在64位Android系统上配置32位编译本机库的支持。 应用程序应使用的库仅作为32位版本提供。 将这些库移植到64位是非常耗时且容易出错的。

因此,我想配置gradle来部署这些预先构建的32位二进制文​​件,并使用32位版本的Android应用程序。

当前配置导致以下错误:

E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: , PID: 2170 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [DexPathList[[zip file "/data/app//base.apk"], nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] enter code here`couldn't find "libmynativelibrary.so" at java.lang.Runtime.loadLibrary(Runtime.java:366) 

似乎PathClassLoader看起来错误的目录。 我检查了提供的apk文件,它缺少库。 apk里面没有lib文件夹。 构建系统不会包含32位库。 由于armv7只有一个预构建版本, armv7这些库位于app/src/main/jnilibs文件夹中。

我必须补充一点,这个设置适用于任何32位Android系统。 我之前尝试过模拟器和物理设备。

如何使用gradle激活multiarch 32 / 64bit支持? 或者如何使用Android Studio / gradle将32位应用程序部署到64位Android系统?

我在网上搜索了一个关于这个主题的链接,但它指的是旧的构建系统: https : //source.android.com/source/64-bit-builds.html 。 我不知道如何采用描述来进行gradle。

我使用的是Android Studio(Build:141.1989493,2015年6月6日)。 project/build.gradle未受影响。 app/build.gradle文件如下所示:

 apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "" minSdkVersion 1 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { debuggable true } } productFlavors { armv7 { ndk { abiFilter "armeabi-v7a" } } fat } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) } 

mulilib的概念仅适用于属于Android系统构建的项目,您不应设置android:multiarch选项,因为您只有32位库,因为此选项仅适用于向其他人提供32位和64位库的应用程序已安装的应用

64位Android系统直接支持32位应用程序。 你只需要在你的应用程序中正确打包,你的.so文件就可以在任何Android设备的lib/(armeabi-v7a,x86,...)中使用。

在安装时,将安装设备首选的体系结构的库。 即:如果没有x86_64文件夹,将安装x86库/如果没有arm64-v8a文件夹,将安装armeabi-v7a库,并且您的应用程序将以32位模式运行。

如果您在lib下没有任何内容,则表示Android Studio不了解您的.so文件。 默认情况下,它会在jniLibs/(armeabi-v7a,x86,...)查找它们,因此您应该将它们放在那里或将sourceSets.main.jniLibs.srcDir更改为您选择的目录。

为了获得64位Android系统的32位应用程序部署,需要在jniLibs文件夹中定义一个armv7 productFlavor和一个子文件夹,命名相应的体系结构。

app/build.gradle产品风味定义:

 android { productFlavors { armv7 { ndk { abiFilter "armeabi-v7a" } } fat } } 

本机库结构:

 app/src/main/jniLibs/armeabi-v7a