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の方がたぶん良いよね。