在我们公司我们正在开发同时包含Java和本机部分的Android SDK。我们以AAR格式打包SDK,其中包含所有资源,java类和本机位。根据AAR规范,本机库应放置在AAR包内的jni文件夹中。由于当前的gradle插件不支持高级NDK用例,并且由于我们有一个非常成熟的Android.mk文件,该文件经过3年的开发,因此我们通过从gradle任务中调用自定义外壳脚本来准备AAR。该Shell脚本使用ndk-build命令构建NDK,并将运行该脚本的任务作为javaCompile任务的依赖项放置(我们的代码有多种形式,每种形式都有自己的NDK规则,这些规则是从定义文件中预先加载的然后作为命令行参数提供给ndk-build)。
最后,当所有内容都被编译后,我们有一个Copy任务,它将本机libs复制到build / intermediates / bundles内的jni文件夹中(该文件夹最终被压缩到AAR中)。在我们更新项目以使用gradle插件v1.5.0之前,此方法一直有效。
在v1.5.0中,将称为Transform API的东西引入了插件。尽管我们不使用它,但此Transform步骤在任务transformNative_libsWithSyncJniLibsForFlavorNameBuildTypeName任务中对本机lib进行了一些转换,该操作发生在将libs复制到jni文件夹中并导致删除jni文件夹中的所有数据之后。这最终将导致不包含本机库的AAR并在需要本机方法时崩溃。
我们通过使用project.tasks[taskName]
获取任务来解决此问题,并确保在将libs复制到jni文件夹之前发生该问题。
但是,遇到这个问题已经开始让我们担心,是否以及何时将gradle-experimental插件(当前唯一支持NDK的插件)退出试验阶段,并将成为构建NDK代码的标准。
我们对该实验性插件进行了一些实验,除了语法不同(为什么?)外,它不支持将调试本机代码作为库模块的一部分(gdb文件未打包到AAR中,并且jniDebuggable标志不再存在)。
有谁知道此插件何时将达到稳定的API并准备在生产版本中使用?我们想从shell脚本到gradle这个只NDK建立相同的功能奇偶校验(加上C ++从Android的工作室,这是不可能的当前配置编辑免费支持未雨绸缪我们从调用NDK建造迁移,所以我们依靠不同的编辑器的JNI胶水代码)。