【发布时间】: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