このプラグインはProject Panamaで開発中(Java13で実装予定)の機能を使いやすくするものです。
特に、JEP 191: Foreign Function Interfaceの利便化を目的としています。
JNR関連記事はこちらのQiitaにまとめたりしているのでよければどうぞ
紹介記事を書きました。
Gradle に公開しました。
システムのJDK・プロジェクトのJDKともにバージョン13以上?
動作保証のJDKは Project Panama Early-Access Builds だけです。
JDKのバージョンが12以下の場合警告文、jextractがシステムのJDKに存在しない場合にはエラー文を出します。
plugins {
id "com.github.Javakky.jnr-ffi" version "1.0.5-SNAPSHOT"
}
jextractとは、C言語などの.hファイルから対応するJavaのインターフェースを生成するツールです。
early-access版のJDKに付属しており、ServiceLoaderを利用することでプログラムからも呼び出すことができます。
このプラグインではjextractというタスクが定義されています。
jextractタスクでは、指定されたフォルダ内にある.hファイルからjextractでjarファイル(対応するインターフェース)を生成するものです。
(入れ子になっているファイルも検索し、ディレクトリをパッケージと対応させてjarを生成します)
jextractタスクのオプションは、build.gradleで以下のように指定できます。
jextract{
// .hファイルを含むディレクトリのパス
// 初期値は"src/main/resources/"
sourceRoot = "head/"
// 生成したjarを置くディレクトリのパス
// 初期値は"libs/"
outPath = "jar"
// 生成するインターフェースが属するパッケージのルート名
// <packageRoot>.<ディレクトリ名>.<ディレクトリ名>という風に命名される
// 初期値は""
packageRoot = "pkg"
// パッケージ名にsourceRootディレクトリを含むかどうか
// falseにすると、SourceRoot直下の.hファイルのパッケージはpackageRootとなる
// 初期値はfalse
includeRoot = false
}
実装予定のタスクです。
C言語のJava処理系があればすぐに実装します。
見つかるまではProcessから既に開発環境にインストールされたbccやgccを呼び出すタスクを簡易的に実装しようと考えています。
このプラグインと合わせて使えるライブラリ作りました。(なお簡易版)
対応OSはWindowsだけ(コード的に別のOSでも動くかもしれませんがテストしていない)です。
resouceフォルダに置いた.dllファイルとjextractで生成したインターフェースからCのコードを呼び出す際、 dllの設定を省略できます。
詳しくはこちら