17

将 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

编辑 实际上,您可以找到在 Google 缓存中链接的信息: 自动打包 CMake 使用的预构建依赖项 说明有:

早期版本的 Android Gradle 插件要求您使用 jniLibs 显式打包 CMake 外部原生构建使用的任何预构建库。使用 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})
4

6 回答 6

14

好的,所以我找到了解决方案,我已将其添加到带有本机库的模块中:

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

我不喜欢它,因为它解决了后果,而不是根本原因。如果有人有更好的解决方案,请在此处发布。

@GavinAndre回答中指出了另一个有效的解决方案 主要的一点是,如果您使用的是 Cmake,则不要将您的存储.sojniLibs文件夹中。

例如,将它们移动到另一个文件夹cmakeLibs
例如:

set_target_properties( dlib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../cmakeLibs/${ANDROID_ABI}/libdlib.so )
于 2020-05-29T15:10:21.893 回答
10

我遇到了同样的问题。

这就是我的 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 将为您自动打包库的信息。

所以我只是在我的 gradle 文件中删除了这个内容,一切正常。

于 2020-06-11T07:42:36.643 回答
6

根据https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs

If you are using Android Gradle Plugin 4.0, move any libraries that are used by IMPORTED CMake targets out of your jniLibs directory to avoid this error.

所以只需要把${ANDROID_ABI}/libdlib.so文件夹移动到别的地方比如新建一个目录名cmakeLibs

例如:

set_target_properties( dlib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../cmakeLibs/${ANDROID_ABI}/libdlib.so )
于 2020-09-13T07:40:33.600 回答
2

好的,所以我找到了解决方案,我已将其添加到带有本机库的模块中:

andrid{
packagingOptions {
        pickFirst "**/lib/**"
    }
}
于 2021-02-18T10:05:46.373 回答
2

在我看来,作为文件夹名称的 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 中)

于 2020-06-10T08:00:31.053 回答
0

根据https://developer.android.com/studio/releases/gradle-plugin#cmake-imported-targets,我修复More than one file was found with OS independent path 'lib/armeabi-v7a/libfreetype.so'了我的 npm 包@flyskywhy/react-native-gcanvas when >= com.android.tools.build:gradle:4.0.0(意味着 react-native >= 0.64) 在/androidbuild.gradle

于 2021-06-20T10:10:32.317 回答