web-dev-qa-db-de.com

Fehler beim Erstellen eines Projekts mit NDK-Unterstützung nach dem Update auf Android Studio 4.0 von 3.6

Nach dem Update von Android Studio auf 4.0 wird die Projekterstellung mit einem Fehler abgeschlossen

Es wurde mehr als eine Datei mit dem vom Betriebssystem unabhängigen Pfad 'lib/armeabi-v7a/libdlib.so' gefunden. Wenn Sie jniLibs und CMake IMPORTED-Ziele verwenden, lesen Sie https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake

Der Link führt zu der Seite mit Neue Funktionen in Android Studio Preview 4.1

[~ # ~] edit [~ # ~] Tatsächlich finden Sie Informationen, die im Google-Cache verknüpft sind: Automatisches Packen vorgefertigter Abhängigkeiten verwendet von CMake Was dort angegeben ist, ist:

Frühere Versionen des Android Gradle Plugin erforderten, dass Sie alle vorgefertigten Bibliotheken, die von Ihrem externen nativen CMake-Build verwendet werden, mithilfe von jniLibs explizit verpacken. Mit Android Gradle Plugin 4.0, Die obige Konfiguration ist nicht mehr erforderlich und führt zu einem Buildfehler:

Bei mir ist das nicht der Fall

Hier sind 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"
}

und 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

Ok, ich habe die Lösung gefunden und diese mit meinen nativen Bibliotheken zum Modul hinzugefügt:

 packagingOptions {
        pickFirst "**/libdlib.so"
    }

Ich mag es nicht so, wie es ist, da es die Konsequenzen behebt, nicht die Grundursache. Wenn jemand eine bessere Lösung hat, posten Sie sie bitte hier.

3

Ich hatte das gleiche Problem.

So schrieb meine Gradle-Datei:

    sourceSets {
        main {
            jniLibs.srcDirs 'src/main/cpp/libs'
        }
    }

Eigentlich gibt es zwei .so-Dateien im Ordner und seit dem Link see https://developer.Android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake scheint die Information zu zeigen Dass Andrioid Stuido automatisch Verpackungsbibliotheken für Sie erstellt.

Also habe ich einfach löschen diesen Inhalt in meiner Gradle-Datei und alles funktioniert gut.

1
Joshua

Meiner Meinung nach löste jniLibs als Name des Ordners fälschlicherweise den Fehler aus. Das Ändern des Namens des Ordners in etwas anderes (ich habe 'Bibliotheken' verwendet) sowohl im Pfad des Dateisystems als auch in der Datei cmakelists.txt löste das Problem.

cmakelists.txt-Fragment

# 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"
        )

es musste nichts an der Gradle-Datei getan werden. Sie findet automatisch die Bibliotheken und legt sie in der AAR-Datei ab. Sie können die aar-Datei entpacken, um dies zu überprüfen. (Bibliotheken befinden sich in {nameofaar}/jni/{Arch_type}/{nameoflib} .so)

1
AndrewBloom