【问题标题】:Android Studio / gradle not building shared library for x86_64Android Studio / gradle 没有为 x86_64 构建共享库
【发布时间】:2015-09-19 23:41:28
【问题描述】:

我正在尝试使用 Android Studio 使用 NDK 制作应用。

这涉及构建一个 .so 文件,然后我的 Java 应用程序将其与 System.loadLibrary 一起使用。

不幸的是,.so 文件仅在 ARM 或 x86 上构建,但 gradle 不为 x86_64 abiFilter 构建它。

我的build.gradle(我正在使用experimental Gradle plugin 为Android Studio 获取NDK 支持),去除了不相关的细节(productFlavors 没有去除任何细节):

apply plugin: 'com.android.model.application'

model {
    android {

        compileSdkVersion = 19
        buildToolsVersion = "23"

        defaultConfig.with {
            applicationId = "com.example"
            minSdkVersion.apiLevel = 14
            targetSdkVersion.apiLevel = 19
        }
    }

    android.ndk {
        moduleName = "JNIProcessor"
    }

    android.productFlavors {

        create("arm") {
            ndk.with {
                abiFilters += "armeabi-v7a"
            }
        }

        create("x86") {
            ndk.with {
                abiFilters += "x86"
            }
        }

        create("x86-64") {
            ndk.with {
                abiFilters += "x86_64"
            }
        }
    }
}

现在,如果我运行 ./gradlew installx86Debug --info,我会进入输出(格式化为多行以便于阅读):

Selected primary task 'installX86Debug' from project :
file or directory '/home/niklas/AndroidStudioProjects/androidcl/app/build/intermediates/pre-dexed/x86/debug', not found
Tasks to be executed: [
    task ':app:preBuild', 
    task ':app:preX86DebugBuild', 
    task ':app:checkX86DebugManifest', 
    task ':app:prepareX86DebugDependencies', 
    task ':app:compileX86DebugAidl', 
    task ':app:compileX86DebugRenderscript', 
    task ':app:generateX86DebugBuildConfig', 
    task ':app:generateX86DebugAssets', 
    task ':app:mergeX86DebugAssets', 
    task ':app:generateX86DebugResValues', 
    task ':app:generateX86DebugResources', 
    task ':app:mergeX86DebugResources', 
    task ':app:processX86DebugManifest', 
    task ':app:processX86DebugResources', 
    task ':app:generateX86DebugSources', 
    task ':app:processX86DebugJavaRes', 
    task ':app:compileX86DebugJavaWithJavac', 
    task ':app:copyX86DebugX86JNIProcessorSharedLibraryGdbServer', 
    task ':app:createX86DebugX86JNIProcessorSharedLibraryGdbsetup', 
    task ':app:compileX86DebugX86JNIProcessorSharedLibraryJNIProcessorMainCpp', 
    task ':app:linkX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:stripSymbolsX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:x86DebugX86JNIProcessorSharedLibrary', 
    task ':app:compileX86DebugSources', 
    task ':app:preDexX86Debug', 
    task ':app:dexX86Debug', 
    task ':app:validateDebugSigning', 
    task ':app:packageX86Debug', 
    task ':app:zipalignX86Debug', 
    task ':app:assembleX86Debug', 
    task ':app:installX86Debug'
]

如果我使用 ./gradlew installx86-64Debug --info 构建 64 位,则输出仅包含(之前的所有 gradlew 输出行对于两个构建都是相同的):

Selected primary task 'installX86-64Debug' from project :
Tasks to be executed: [
    task ':app:preBuild', 
    task ':app:preX86-64DebugBuild', 
    task ':app:checkX86-64DebugManifest', 
    task ':app:prepareX86-64DebugDependencies', 
    task ':app:compileX86-64DebugAidl', 
    task ':app:compileX86-64DebugRenderscript', 
    task ':app:generateX86-64DebugBuildConfig', 
    task ':app:generateX86-64DebugAssets', 
    task ':app:mergeX86-64DebugAssets', 
    task ':app:generateX86-64DebugResValues', 
    task ':app:generateX86-64DebugResources', 
    task ':app:mergeX86-64DebugResources', 
    task ':app:processX86-64DebugManifest', 
    task ':app:processX86-64DebugResources', 
    task ':app:generateX86-64DebugSources', 
    task ':app:processX86-64DebugJavaRes', 
    task ':app:compileX86-64DebugJavaWithJavac', 
    task ':app:compileX86-64DebugSources', 
    task ':app:preDexX86-64Debug', 
    task ':app:dexX86-64Debug', 
    task ':app:validateDebugSigning', 
    task ':app:packageX86-64Debug', 
    task ':app:zipalignX86-64Debug', 
    task ':app:assembleX86-64Debug', 
    task ':app:installX86-64Debug'
]

因此 64 位构建缺少这些条目:

    task ':app:copyX86DebugX86JNIProcessorSharedLibraryGdbServer', 
    task ':app:createX86DebugX86JNIProcessorSharedLibraryGdbsetup', 
    task ':app:compileX86DebugX86JNIProcessorSharedLibraryJNIProcessorMainCpp', 
    task ':app:linkX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:stripSymbolsX86DebugX86JNIProcessorSharedLibrary', 
    task ':app:x86DebugX86JNIProcessorSharedLibrary', 

这清楚地说明了为什么我的 .so 文件丢失(例如,link 任务不存在)。

为什么 gradle 决定不为我的 x86_64 abiFilter 添加链接步骤?

【问题讨论】:

  • 我可以通过设置compileSdkVersion = 23和targetSdkVersion.apiLevel = 23而不是19来获得缺失的目标。但我仍然不明白为什么。
  • 可能是因为 API 21 引入了对 x64 平台的支持:developer.android.com/ndk/guides/x86-64.html#comp
  • @V-master 我认为你是对的。我本来希望“大声失败”而不是“默默地放弃一些构建目标”(例如link)行为,但如果您将此作为答案发布,我会接受。
  • 如果你有 targetSdkVersion.apiLevel = 23 和 compileSdkVersion = 19,它应该自动构建带有更新头文件的 x64 库?至少那是我在某处读过的,但它根本没有!无法在任何 API 版本上构建单个 APK?
  • 好的,伙计们,我有一个严重的问题。它开始突然发生,现在 AndroidStudio 不为任何架构构建 64 位 so 文件(我尝试过 Intel、ARM 和 MIPS,但都没有构建),但它确实为所有 32 位架构构建。那么发生了什么,我该如何解决呢?请问有什么帮助吗?值得一提的是,当我直接在 64 位手机上启动应用程序时,它可以工作,但找不到 64 位 .so 文件。

标签: android android-studio android-ndk android-gradle-plugin


【解决方案1】:

通过将“platformVersion”内部 NDK 标记设置为 23(可能只需要为 21 或更高)解决了这个问题。因此,不是用于 Java 部分的 minSdkVersion 和 targetSdkVersion 值,而是用于 NDK 部分的 platformVersion 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2016-06-07
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2016-07-29
    • 2018-04-22
    相关资源
    最近更新 更多