前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin Native 也能运行在 Android 当中?

Kotlin Native 也能运行在 Android 当中?

作者头像
bennyhuo
发布2020-02-20 13:22:42
8960
发布2020-02-20 13:22:42
举报
文章被收录于专栏:BennyhuoBennyhuo

引子

Kotlin Native 可以编译成 *.so 也就是我们常说的动态库,自然也就可以被 Android 的 Jni 调用,显然 Kotlin Native 官方的 NativeActivity 的例子已经说明这一点。

不过,想要在 Jni 和 Kotlin Native 之间无缝衔接或者直接连接,那还是不行滴,目前还只能通过 C wrap 一下才行的,这个与 Kotlin Native 的 python 例子是一致的。

且不说 Kotlin Native 运行在 Android 当中是否合适,单单是能够运行这一点,已经让我们看到了 Kotlin 称霸 Android 线上线下(Java、C/C++)的希望,也许某一天,我们写 Native 代码都只用 Kotlin Native 了呢。

还有人说 React Native,我前面已经写过例子了啊,除了 JSX ,其他的 KotlinJs 也毫无压力嘛。

称霸宇宙,指日可待。

如何构建

用 Kotlin Native 交给 Android 调用,其实还是有点儿小坑的,主要是 soname 的问题,我把我跑通的工程放到了 github 上面,大家可以愉快的先 star 再 clone 啦。

GitHub: Hello-Kni https://github.com/enbandari/hello-kni

代码其实也很简单,是直接用 Google 官方的 hello-jni 改的,在 Kotlin Native 层输出了一行日志,返回了一个字符串,仅此而已:

代码语言:javascript
复制
fun sayHello(){
    println("Hello from Kotlin Native!!")
}

fun getString() = "This is from Kotlin Native!!"

在 C 代码中调用:

代码语言:javascript
复制
#include <string.h>
#include <jni.h>
#include <knlib.h>

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    knlib_symbols()->kotlin.root.sayHello();
    return (*env)->NewStringUTF(env, knlib_symbols()->kotlin.root.getString());
}

我们可以看到有个叫 knlib.h 的头文件,这就是 Kotlin Native 生成的。另外,为了让我们的 Android 工程找到 Kotlin Native 的依赖,需要在 CMake 当中配置:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.4.1)

# 我们构建生成的库的路径,参考下面提到的 build.sh
set(PREBUILT ${CMAKE_SOURCE_DIR}/../../../../prebuiltLibrary/build)

add_library(hello-jni SHARED
            hello-jni.c)

# 添加头文件
target_include_directories(hello-jni PRIVATE
                      ${PREBUILT}/include)

# 添加库
add_library(libknlib SHARED IMPORTED)
set_target_properties(libknlib PROPERTIES
                    IMPORTED_LOCATION "${PREBUILT}/libs/armeabi-v7a/libknlib.so"
                    IMPORTED_NO_SONAME ON)

# 链接库
target_link_libraries(hello-jni
                      android
                      log
                      libknlib)

同时,也需要让 gradle 知道这个 so 库要打包进 apk,所以:

代码语言:javascript
复制
sourceSets {
        main {
            jniLibs.srcDirs = ['../prebuiltLibrary/build/libs']
        }
    }

构建步骤如下:

1.安装 Kotlin Native 编译器,当然你也可以自己编译。把编译器的路径(包含 konan 命令的目录)添加到 $PATH。

2.运行以下命令得到 Kotlin Native 编译好的依赖:

代码语言:javascript
复制
cd prebuiltLibrary
./build.sh

3.运行 app。

运行效果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Kotlin 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引子
  • 如何构建
  • 运行效果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档