如何在 Android Studio 中设置 JNI 子目录

How to set up JNI sub directories in Android Studio

假设我们得到的代码结构如下

src/
├── androidTest
├── app.iml
├── build.gradle
├── main
│   ├── AndroidManifest.xml
│   ├── java
│   ├── jni
│   │   ├── common
│   │   │   ├── inc
│   │   │   │   ├── common.h
│   │   │   │   ├── ...
│   │   │   └── src
│   │   │       ├── common.cc
│   │   │       ├── ...
│   │   └── native-media.cc
│   └── res
├── proguard-rules.pro
└── test

我想告诉 Gradle main/jni 中的所有源代码都应该编译。如果我直接离开,AS(Android Studio) 会使用jni 目录下的所有文件进行编译。但是如果这里有一些子目录,比如common/inc和common/src,AS就会混淆。

我在谷歌上搜索了很多,但我找到的所有方法都行不通。(例如 Gradle-experimental,实际上 Android 如果我这样做,Studio 会投诉并罢工。)

那么,用 Gradle 讨论 JNI 目录的正确方法是什么,就好像我在用 CMake 或 GNUMake 讨论一样...

AS会默认编译jni目录下的所有C/C++文件。如果您需要更多控制,请使用实验性插件,或禁用内置任务和 运行 ndk-build,例如参见 [​​=11=]。

Android Studio gradle-experimental plugin默认使用${app}/src/main/jni作为原生代码,处理是递归的:所有的子目录都会被包含进去构建本机共享库。如果有一些您不想要的特定文件,您可以尝试 "exclude",如:
https://github.com/googlesamples/vulkan-basic-samples/blob/master/LunarGSamples/Demos/Hologram/android/build.gradle

请注意,exclude 是针对文件名的,与它位于哪个目录或具有多个同名文件无关。在上面的 link 中,它还包括来自 "jni" 文件夹之外的其他目录的源代码。

您可能还会看到这个例子:
https://github.com/googlesamples/android-ndk/tree/master/Teapot/app/src/main/jni 它构建并运行,在 jni 下也有子目录,但不使用 "exclude".

您的问题可能是其他问题,Android Studio 可以处理嵌套目录。如果您可以在代码中添加一个 ling,那就太好了。