Android NDK -multlib 支持使用 gradle

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

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

我正在寻找一种方法来使用 gradle 构建系统在 64 位 Android 系统上配置对 32 位编译 native 库的支持。应用程序应使用的库仅可用于 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'])
}

最佳答案

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

64位安卓系统直接支持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 到您选择的目录。

关于Android NDK -multlib 支持使用 gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761725/

相关文章:

安卓谷歌地图 : How to get the area which is currently shown in screen device?

android - 字段/常量 CV_FILLED 属于哪个 OpenCV4Android 类?

java - 即使在 AsyncTask 中运行时也出现 android.os.NetworkOnMainThreadException 错误

android - 何时将分支 merge 到主分支

android - 命令 APP_CMD_SAVE_STATE 的目的是什么?

android - 如何在我的共享库中包含正确的包含文件以使用 libdvm.so?

android - 我无法在 Firebase 中重新验证或撤销用户的访问 token

java - 我可以删除 listView 数组但不更新 listview 吗?

java - Android Studio 构建错误 : "Content is not allowed in prolog."

android - 无法将 eng.traineddata 添加到我的 Tesseract 项目 Android 5.0