Kotlin/Native - cinteropメモ


Gradle経由ではなく、コマンドを直接実行して動作を確認。
CでラッピングすればC++も使えた(当たり前だけど)

以下、確認したことをつらつら書いておく

呼び出し用のライブラリコード

hello.cpp

#include <iostream>
#include "hello.h"

using namespace std;

void
hello(void)
{
    cout << "hello world" << endl;
}

hello.h

#ifndef __HELLO_H__
#define __HELLO_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

void hello(void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __HELLO_H__ */

スタティックライブラリを作る

$ clang++ -c hello.cpp
$ libtool -static hello.o -o libhello.a

cinterop用のdefファイル

libhello.def

headers = hello.h
compilerOpts = -I./
staticLibraries = libhello.a
libraryPaths = ./

正確かどうかは知らない。

項目 内容
headers 解析対象。ここに定義されている関数がKotlin側で使えるようになる
compilerOpts headers指定ファイルの探索パス
staticLibraries スタティックリンクする場合にリンクするライブラリファイルを指定する。
libraryPaths staticLibraries指定ファイルの探索パス

linkerOptsはダイナックリンク(dylib, so, dllとか)用

klib作る

$ cinterop -def libhello.def -o hello

hello.klibが作られる

C関数を呼び出すKotlinコード

main.kt

import libhello.*

fun main(args: Array<String>) {
    hello()
}

作ったklibと合わせてビルドする

konanc main.kt -library hello -o hello

hello.kexeができる。
これはそのまま実行できる

./hello.kexe

その他

klibのリポジトリとか作るのだろうか。
C/C++使えるのでどうとでもなるがPure Kotlinの方がたぶん良いよね。


関連記事