web-dev-qa-db-fra.com

Erreur lors de la création du projet avec le support NDK après la mise à jour vers Android Studio 4.0 à partir de la version 3.6

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})
9
Roman Nazarevych

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.

3
Roman Nazarevych

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.

1
Joshua

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)

1
AndrewBloom