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 意外と動く。しかしコンパイルは遅い。
Published: 2017-05-19(Fri) 00:57