Blog

kotlin native で外部のライブラリとリンクする

kotlin native は外部のライブラリとリンクするのも簡単にできます。

以下、例として openssl にアクセスしてみます。

openssl.def として以下のように記載します。

headers = openssl/crypto.h openssl/opensslv.h

openssl.def を利用するコードとして以下のように記載(型の推移がわかりやすいように冗長にかいてます)。

import openssl.*
import kotlinx.cinterop.*

fun main(args: Array<String>) {
    val ver: CPointer<ByteVar>? = SSLeay_version(SSLEAY_VERSION)
    val verStr: String = ver!!.toKString()
    println(verStr)
}

あとは、以下のように Makefile でビルドしたら出来上がり。

all: sample.kexe

CCFLAGS=-I/usr/local/opt/openssl/include

clean:
        rm -rf openssl.kt.bc-build/ openssl.kt.bc/ openssl.kt.bc.klib sample.kexe "sample}.kt.bc"

openssl.kt.bc: openssl.def
        cinterop -copt "${CCFLAGS}" -def openssl.def -o openssl.kt.bc

sample.kexe: sample.kt openssl.kt.bc
        kotlinc-native -linkerArgs "-L/usr/local/opt/openssl/lib -lcrypto" -library openssl.kt.bc sample.kt -o sample

.PHONY: all clean

Makefile じゃなくて gradle でビルドするようにしたほうが良いが、めんどくさくて使い慣れた Makefile で今回はビルドしてみた。

実行結果は以下のようになる。

tokuhirom@mba ~/dev/kotlin-native-samples/openssl-version $ ./sample.kexe
OpenSSL 1.0.2k  26 Jan 2017

まとめ

kotlin native 意外と動く。しかしコンパイルは遅い。