Après la mise à jour Android Studio vers la version 4.0 du projet se termine avec une erreur
Plus d'un fichier a été trouvé avec le chemin indépendant du système d'exploitation 'lib/armeabi-v7a/libdlib.so'. Si vous utilisez des cibles jniLibs et CMake IMPORTED, voir https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake
Le lien mène à la page avec Nouvelles fonctionnalités dans Android Studio Preview qui est 4.1
[~ # ~] edit [~ # ~] En fait, vous pouvez trouver des informations liées dans le cache Google: Empaquetage automatique des dépendances préconstruites utilisé par CMake Ce qui est indiqué ici est:
Les versions précédentes de Android Gradle Plugin exigeait que vous empaquiez explicitement toutes les bibliothèques prédéfinies utilisées par votre build natif externe CMake à l'aide de jniLibs. Avec Android Gradle Plugin 4.0, la configuration ci-dessus n'est plus nécessaire et entraînera un échec de compilation:
Mais ce n'est pas le cas pour moi
Voici build.gradle
apply plugin: 'com.Android.library'
apply plugin: 'kotlin-Android'
Android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
cFlags "-O3"
cppFlags "-std=c++11 -frtti -fexceptions -mfpu=neon"
arguments "-DANDROID_PLATFORM=Android-16",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared",
"-DANDROID_ARM_NEON=TRUE",
"-DANDROID_CPP_FEATURES=rtti exceptions"
}
}
}
buildTypes {
debug {}
stage {
debuggable true
minifyEnabled false
}
release {
minifyEnabled false
}
}
kotlinOptions {
jvmTarget = "1.8"
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
packagingOptions {
pickFirst "**/libc++_shared.so"
pickFirst "**/libdlib.so"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.annotation:annotation:1.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
et CMakeLists.txt
set(LIB_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
#
cmake_minimum_required(VERSION 3.4.1)
add_library(dlib SHARED IMPORTED)
# sets the location of the prebuilt dlib .so
set_target_properties( dlib
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../jniLibs/${Android_ABI}/libdlib.so )
# ------------------------------------------------------------------
add_library( # Sets the name of the library.
face-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
face-lib.cpp)
target_include_directories(
face-lib PRIVATE
${CMAKE_SOURCE_DIR}/include
)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
target_link_libraries( # Specifies the target library.
face-lib
dlib
# Links the target library to the log library
# included in the NDK.
${log-lib})
Ok, j'ai donc trouvé la solution, j'ai ajouté ceci au module avec mes bibliothèques natives:
packagingOptions {
pickFirst "**/libdlib.so"
}
Je ne l'aime pas tel quel, car il corrige les conséquences, pas la cause profonde. Si quelqu'un a une meilleure solution, veuillez la poster ici.
J'ai fait face au même problème.
C'est ainsi que mon fichier gradle a été écrit:
sourceSets {
main {
jniLibs.srcDirs 'src/main/cpp/libs'
}
}
En fait, il y a deux fichiers .so dans le dossier et depuis le lien see https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake
semble montrer l'information qu'Andrioid Stuido empaquetera automatiquement les libs pour vous.
Donc je viens de supprimer ce contenu dans mon fichier gradle et tout fonctionne bien.
De mon côté, il semblait que jniLibs comme nom du dossier déclenchait l'erreur par erreur. changer le nom du dossier par autre chose (j'ai utilisé des "bibliothèques") à la fois dans le chemin du système de fichiers et dans cmakelists.txt a résolu le problème.
fragment cmakelists.txt
# import library and set path
add_library(ixxs-plugin SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(ixxs-plugin PROPERTIES
IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/../libraries/${CMAKE_Android_Arch_ABI}/libixxs-plugin.so"
)
il n'y avait rien à faire sur le fichier gradle, il trouvera automatiquement les libs et les mettra dans le fichier aar. vous pouvez décompresser le fichier aar pour vérifier cela. (les bibliothèques sont dans {nameofaar}/jni/{Arch_type}/{nameoflib} .so)