前不久有个兄弟问有没有可能把之前 Native 写 Jni 的工程改造成 Gradle 的。正好借此机会把之前的工程整理得更完整一些。
在读这篇文章之前,大家可以去参考下之前的文章:
之前两篇文章已经介绍了如何通过 CName
注解来限定 Kotlin-Native 代码编出来的动态链接库的符号名,以实现与 Java 的 native 方法的绑定,也介绍了如何使用 JNI_OnLoad
来动态注册 native 方法来实现绑定。换句话说,如果你想要知道如何用 Kotlin-Native 写 Android 的 Jni 层代码,那么前面的两篇文章里面就有答案。
前文撰写的时候 Kotlin-Native 的构建插件尚未稳定,当时除了 Multiplatform Project(以下简称 mpp) 的 Gradle 插件以外还有一个单独的 native 的插件,用法也不是特别统一,现在后者已经被废弃,因此我们只需要用 mpp 的插件来构建 Kotlin-Native 的工程即可。顺带提一句,现在使用 Kotlin DSL 来编写 Gradle 脚本体验已经比之前强多了,建议大家把 IDE 的 Kotlin 插件升级到 1.3.70 以上版本来体验。
接下来我们就把之前的工程改造一下,工程源码见: hello-kni 。
首先我们创建一个 Module,你可以选择使用 IntelliJ 的 new module 方式,选择创建一个 Android library,当然也可以自己创建一个目录,然后再创建一个 build.gradle.kts 文件,就像这样:
接着,在 settings.gradle.kts 当中引入这个 Module:
include(":app", ":nativeLib")
好,关键来了,剩下的主要就是修改 build.gradle.kts。我们先来添加 mpp 的 Gradle 插件:
plugins { kotlin("multiplatform") version "1.3.71" id("com.android.library") }
这里可以看到我们还添加了 Android 的 library 插件,原因是我们想要把 Kotlin-Native 编译出来的 so 打进一个 aar 里面作为 Android 的依赖提供给 app 工程。
所以构建出来的 so 文件我们需要引入到 aar 的编译流程中,可以将这个 so 文件复制到一个路径,我们把这个路径添加为 Android 的 jniLibs 路径即可:
val jniLibDir = File(project.buildDir, arrayOf("generated", "jniLibs").joinToString(File.separator)) android { ... sourceSets { val main by getting { jniLibs.srcDir(jniLibDir) } } }
我们在 build 目录下选了 generated/jniLibs 作为 jniLibs 目录添加到了 aar 的编译流程中。接下来我们只需要完成 so 文件的复制即可:
kotlin { androidNativeArm32 { binaries { sharedLib("knlib") { if(buildType == NativeBuildType.RELEASE){ linkTask.doLast { copy { from(outputFile) into(File(jniLibDir, "armeabi-v7a")) } } afterEvaluate { val preReleaseBuild by tasks.getting preReleaseBuild.dependsOn(linkTask) } } } } } }
kotlin mpp 的工程配置非常清晰:
工程配置搞定之后,我们还需要把源码添加进来。androidNativeArm32 的源码路径默认为 src/androidNativeArm32Main/kotlin,因此我们把之前已经写好的 Kotlin-Native 的源文件添加进去即可:
另外作为 Android Library 工程,manifest 文件当然是必须的,不过里面也不需要有什么特别的配置。
至此,使用 Kotlin-Native 编写 Jni 的工程改造就完成了,在 app 工程中添加依赖:
implementation(project(":nativeLib"))
直接编译运行 app 工程即可运行,再也不用使用命令行编译啦。
如果大家想要快速上手 Kotlin 或者想要全面深入地学习 Kotlin 的相关知识,可以关注我基于 Kotlin 1.3.50 全新制作的新课,课程第一版曾帮助3000多名同学掌握 Kotlin,这次更新回归内容更精彩:
扫描二维码或者点击链接 《Kotlin 入门到精通》 即可进入课程啦!
想要找到好 Offer、想要实现技术进阶的迷茫中的 Android 工程师们,推荐大家关注下我的新课《破解Android高级面试》,这门课涉及内容均非浅尝辄止,目前已经有700+同学在学习,你还在等什么(*≧∪≦):
扫描二维码或者点击链接 《破解Android高级面试》 即可进入课程啦!