NDK 错误“意外的本机构建目标 xyz。有效目标是:”

mar*_*nev 6 shared-libraries gradle android-ndk

我有一个 Android Studio 项目,它依赖于本机共享库。我创建了一个 cmake 文件来编译该库,并在 android 项目中添加了一个指向共享库的软链接(在src/main/jniLibs/armeabi)。这样,当构建 android 项目时,共享库就会包含在包中。

这是相关部分build.gradle

android {
    ...
    externalNativeBuild {
        cmake {
            path "../cpp/CMakeLists.txt"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是 gradle 在调用构建共享库的指令之前尝试打开共享库。

Information:Gradle tasks [:app:assembleDebug]
Error:Could not list contents of 'app/src/main/jniLibs/armeabi/libfoo.so'. Couldn't follow symbolic link.
Run Code Online (Sandbox Code Playgroud)

如何从项目内部调用 cmake 并同时将库包含在项目中?

--

编辑

在 cmake 中,共享库是使用ExternalProject_Add. 不幸的是,gradle 没有看到该目标,也没有将导入的共享库视为目标。所以这不起作用:

add_library(libfoo SHARED IMPORTED GLOBAL)
add_dependencies(libfoo libactual)
Run Code Online (Sandbox Code Playgroud)

我尝试使用 gradle 配置调用构建特定目标:

defaultConfig {
    ...
    externalNativeBuild {
        cmake {
            targets "libfoo"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但 gradle 仍然没有看到它并失败:

Unexpected native build target libfoo. Valid values are:
Run Code Online (Sandbox Code Playgroud)

有效值基本上是一个空列表。

目前,我通过根据库创建一个虚构的可执行文件来解决这个问题。

add_executable(libfoo a.c)
add_dependencies(libfoo libactual)
Run Code Online (Sandbox Code Playgroud)

Top*_*ter 0

就我而言,我添加了一个新的 CMake 目标,但没有以某种方式缓存(通过 CMake 或 Gradle)。

只需关闭 Android Studio,删除整个build.build目录,然后打开 Android Studio 并再次构建即可。

请注意,子项目有自己单独的构建目录。

因此,您可能需要搜索单词build,并在确保不需要找到的结果后,也将其删除。


如果仍然没有修复,请记住 CMake 有它自己的单独的缓存文件,这些文件通常位于所述目录内,除非您直接运行 CMake(在 Android Studio 之外)。