如何在Android Studio中使用ndk-build的自动调用

How to use the automatic invocation of ndk-build in Android Studio

在较新版本的 Android Studio 中,我们可以在 /jni 文件夹中构建 .cpp 和 .c 文件,而无需任何 android.mk 文件。这是通过简单地在我们的 build.gradle 文件中放置类似以下行的内容来实现的:

defaultConfig {
        ..

        ndk {
            moduleName "niceprocess"
            cFlags "-std=c++11 -fexceptions"
            ldLibs "log"
            stl "gnustl_shared"
            abiFilter "armeabi-v7a"
        }
    }
}

这似乎递归地构建它找到的 jni 文件夹中的所有内容,并将其放置在 'niceprocess' 模块中。

我的主要问题是——有没有一种方法可以控制用哪些文件构建哪些模块,并构建多个模块,每个模块都有不同的 cFlags,并能够从一个模块中 #include headers另一个。

我知道这一切都可以通过 android.mk 来完成,但我想知道是否可以使用 gradle 系统。

不,无法控制使用哪些文件构建哪些模块以及许多其他内容。截至目前,gradle Android Studio 插件仅支持 NDK 构建的一种非常基本的情况 - 只有一个模块没有任何依赖性,完全从位于 [=17= 的源文件集编译而来]文件夹。

您可以自行评估 - 只需查看 NdkOptions.java and NdkCompile.groovy。在第一个文件中,您可以看到 gradle 脚本中 NDK 支持的唯一选项是 'moduleName'、'cFlags'、'ldLibs'、'stl' 和 'abiFilters'.在第二个文件中,您可以看到 Android.mk 如何使用该选项生成,没有任何机会对其进行超出该选项允许的自定义。

如果您需要对原生源构建进行更智能的控制,您需要在 gradle 脚本中禁用 NDK 支持并使用 ndk-build 的显式调用。这样,您需要在 Android Studio 中将源文件添加到源树后手动指定 Android.mk 中的一组源文件,这不是很方便,但您可以更好地控制模块、它的依赖项、它的构建选项等