Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从3.6更新到Android Studio 4.0后,在使用NDK支持构建项目时出错_Android_Android Studio_Android Ndk_Android Studio 4.0 - Fatal编程技术网

从3.6更新到Android Studio 4.0后,在使用NDK支持构建项目时出错

从3.6更新到Android Studio 4.0后,在使用NDK支持构建项目时出错,android,android-studio,android-ndk,android-studio-4.0,Android,Android Studio,Android Ndk,Android Studio 4.0,将Android Studio更新为4.0后,项目构建完成,但出现错误 找到多个独立于操作系统的路径为“lib/armeabi-v7a/libdlib.so”的文件。如果您使用的是jniLibs和CMake导入的目标,请参阅 该链接指向Android Studio预览版(4.1版)中具有新功能的页面 编辑 实际上,您可以在Google cache中找到链接的信息: 这里所说的是: Android Gradle插件的早期版本要求您使用jniLibs显式打包CMake外部本机构建使用的所有预构建库。

将Android Studio更新为4.0后,项目构建完成,但出现错误

找到多个独立于操作系统的路径为“lib/armeabi-v7a/libdlib.so”的文件。如果您使用的是jniLibs和CMake导入的目标,请参阅

该链接指向Android Studio预览版(4.1版)中具有新功能的页面

编辑 实际上,您可以在Google cache中找到链接的信息: 这里所说的是:

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

好的,我已经找到了解决方案,我已经用我的本机库将其添加到模块中:

 packagingOptions {
        pickFirst "**/libdlib.so"
    }
andrid{
packagingOptions {
        pickFirst "**/lib/**"
    }
}
我不喜欢它,因为它修复了后果,而不是根本原因。 如果有人有更好的解决方案,请张贴在这里

另一个有效的解决方案是@GavinAndre 要点是,如果您使用的是Cmake,那么就不要将
.so
存储在
jniLibs
文件夹中

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

例如:

set_target_properties( dlib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/../cmakeLibs/${ANDROID_ABI}/libdlib.so )

在我这方面,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文件做任何操作,它会自动找到libs并将它们放入aar文件中。您可以解压aar文件以进行检查。(lib在{nameofaar}/jni/{arch_type}/{nameoflib}中。因此)

我面临同样的问题

我的gradle文件就是这样写的:

    sourceSets {
        main {
            jniLibs.srcDirs 'src/main/cpp/libs'
        }
    }
实际上文件夹中有两个.so文件,由于链接
请参见https://developer.android.com/studio/preview/features#automatic_packaging_of_prebuilt_dependencies_used_by_cmake
似乎显示了Android Stuido将为您自动打包LIB的信息

因此,我只是删除了我的gradle文件中的内容,一切正常。

根据

因此,您只需将
${ANDROID_ABI}/libdlib.So
文件夹移动到另一个位置,例如创建一个新的目录名cmakeLibs

例如:


好的,我已经找到了解决方案,我已经用我的本机库将其添加到模块中:

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

我认为这是由于“添加库(dlib共享导入)”。但我不知道如何正确地解决这个问题。我也有同样的问题。这是因为您导入了
目标,并且在
jniLibs
中拥有库。这两种情况都会导致它被打包,打包任务不够聪明,无法对它们进行重复数据消除。显然,pickFirst是为我工作的!我还不明白是什么导致了这一点,实际上在我的例子中,我删除了
jniLibs
文件夹(因为我是从PC上的本地目录导入的)。此外,我还有另一个库(arcore)也提供了这样的错误,所以这里我需要添加
pickFirst
,正如您在回答的第一部分中提到的。所以,谢谢:)我不得不放弃升级超过十个模块的项目,每个模块都有一些。所以导入的libs…在这里打开了一个bug:很抱歉文档问题。由于某种原因,它从4.0发行说明中删除了。获取固定atm。在添加
packagingOptions
块之前,我可以立即复制问题。这就解决了问题。这是您为解决问题而添加的内容吗?因此,对于每个表示“libs”文件夹的“set\u target\u properties”,我们都应该为“libs”更改“libs”?我有
jniLibs
,我用
进行了更改,您可以用类似
iwanaboriginalandnotuselibraries
的其他内容来更改它。在cmakelists文件和文件系统上。祝你好运。这应该被标记为正确答案,因为Gradle插件是谁引入了这一变化的第一个答案是一种黑客方式