【问题标题】:Android NDK - multlib support using gradle使用 gradle 的 Android NDK -multlib 支持
【发布时间】:2015-08-26 00:33:25
【问题描述】:

我的问题是针对 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)

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

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

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

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

我正在使用 Android Studio(内部版本: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'])
}

【问题讨论】:

    标签: android android-studio android-ndk android-gradle-plugin 32bit-64bit


    【解决方案1】:

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

    64 位 Android 系统直接支持 32 位应用程序。与任何 Android 设备一样,您只需要正确打包您的应用,将您的 .so 文件放入 APK 的 lib/(armeabi-v7a,x86,...) 中。

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

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

    【讨论】:

      【解决方案2】:

      为了获得 64 位 Android 系统的 32 位应用程序部署,需要定义 armv7 productFlavorjniLibs 文件夹内的子文件夹,命名相应的架构。

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

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

      原生库结构:

      app/src/main/jniLibs/armeabi-v7a
      

      【讨论】:

      • 谁能解释一下“productFlavors”中的“胖子”是什么?是否需要强制?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2014-05-11
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2015-04-27
      • 2015-03-26
      相关资源
      最近更新 更多