Android NDK - 使用gradle支持multlib

Mat*_*olz 9 android 32bit-64bit android-ndk android-studio android-gradle-plugin

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

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

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

当前配置导致以下错误:

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

好像PathClassLoader在错误的目录中看起来好像.我检查了提供的apk文件,它缺少库.libapk中没有文件夹.构建系统不会包含32位库.由于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 "<application_name>"
        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'])
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*olz 2

为了在 64 位 Android 系统上部署 32 位应用程序,需要定义一个armv7 productFlavor在文件夹内定义一个子文件夹jniLibs,命名相应的架构。

\n\n

产品风味定义app/build.gradle

\n\n
android {\n   productFlavors {\n      armv7 { ndk { abiFilter "armeabi-v7a" } }\n      fat\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

本机库结构:\xe2\x80\xaf

\n\n
app/src/main/jniLibs/armeabi-v7a\n
Run Code Online (Sandbox Code Playgroud)\n