Ошибка при сборке проекта с поддержкой NDK после обновления до Android Studio 4.0 с 3.6 - PullRequest
11 голосов
/ 29 мая 2020

После обновления Android Studio до 4.0 завершается сборка проекта с ошибкой

Найдено несколько файлов с независимым от ОС путем 'lib / armeabi-v7a / libdlib.so'. Если вы используете цели jniLibs и CMake IMPORTED, см. https://developer.android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake

Ссылка ведет на страницу с Новые функции в Android Studio Preview что составляет 4.1

EDIT На самом деле вы можете найти информацию, которая связана в кеше Google: Automati c упаковка предварительно созданных зависимостей, используемых CMake То, что указано, есть :

Предыдущие версии подключаемого модуля Android Gradle требовали, чтобы вы явно упаковали любые предварительно созданные библиотеки, используемые вашей внешней собственной сборкой CMake, с помощью jniLibs. С Android Gradle Plugin 4.0 указанная выше конфигурация больше не нужна и приведет к сбою сборки:

Но это не так для меня

Вот 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"
}

и 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})

Ответы [ 3 ]

5 голосов
/ 29 мая 2020

Хорошо, я нашел решение, я добавил это в модуль с моими родными библиотеками:

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

Мне это не нравится, потому что он устраняет последствия, а не root причина. Если у кого-то есть лучшее решение, опубликуйте его здесь.

3 голосов
/ 11 июня 2020

Я столкнулся с той же проблемой.

Вот как написан мой файл gradle:

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

На самом деле в папке есть два файла .so, и поскольку ссылка see https://developer.android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake кажется чтобы показать информацию Этот Andrioid Stuido будет автоматически c упаковывать библиотеки для вас .

Поэтому я просто удаляю это содержимое внутри моего файла gradle, и все работает нормально.

2 голосов
/ 10 июня 2020

На моей стороне показалось, что jniLibs как имя папки ошибочно вызывал ошибку. изменение имени папки на другое (я использовал «библиотеки») как в пути к файловой системе, так и в cmakelists.txt, решило проблему.

фрагмент 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"
        )

с файлом gradle ничего не нужно было делать, он автоматически найдет библиотеки и поместит их в файл aar. вы можете разархивировать файл aar, чтобы проверить это. (библиотеки находятся в {nameofaar} / jni / {arch_type} / {nameoflib} .so)

...