Я пытаюсь использовать Android Studio для создания приложения с помощью NDK.Android Studio/gradle не для создания общей библиотеки для x86_64
Это связано с созданием файла .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'
]
Если же я построить 64 бит с ./gradlew installx86-64Debug --info
, вывод содержит только (все gradlew
НУ tput линии до них одинаковы для двух сборок):
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
нет).
Почему град решил не добавлять ссылку для моего x86_64 abiFilter
?
Я могу получить недостающие цели, установив 'compileSdkVersion = 23' и' targetSdkVersion.apiLevel = 23' вместо 19. Но я до сих пор не понимаю, почему. – nh2
может быть из-за поддержки платформы x64, был введен с API 21: https://developer.android.com/ndk/guides/x86-64.html#comp –
@ V-master Я думаю, что вы правы. Я бы ожидал «громкого сбоя» вместо «молча отбросить некоторые цели сборки» (например, «ссылка»), но если вы опубликуете это как ответ, я его приму. – nh2