アクセスする必要のある特定のライブラリへのCヘッダーがあります。そこで、私はJNAeratorを使用して、退屈なコードの遷移を実行しました。最近、人々がそれを推奨していることを読んだ後です。私が見たものからはかなり堅実なようです:
public class Z3_apiLibrary implements Library {
public static final String JNA_LIBRARY_NAME = LibraryExtractor.getLibraryPath("z3_api", true, z3_api.Z3_apiLibrary.class);
public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(JNA_LIBRARY_NAME, com.ochafik.lang.jnaerator.runtime.MangledFunctionMapper.DEFAULT_OPTIONS);
static {
Native.register(JNA_LIBRARY_NAME);
}
public static interface Z3_lbool {
public static final int Z3_L_FALSE = -1;
public static final int Z3_L_UNDEF = 0;
public static final int Z3_L_TRUE = 1;
};
public static interface Z3_symbol_kind {
public static final int Z3_INT_SYMBOL = 0;
public static final int Z3_STRING_SYMBOL = 1;
};
完全なコードは私のGitHubにあります。
ここで、dllをオブジェクトとしてインスタンス化し、作成したインターフェイスからヘッダー情報をラッパーとして渡します。
public class z3_Solver {
public static void main(String[] args) {
Z3_apiLibrary solver = (Z3_apiLibrary) Native.loadLibrary("z3", Z3_apiLibrary.class);
Z3_apiLibrary config = new Z3_apiLibrary.Z3_config(); // will not work!
}
驚いたことに、これは機能していません。.Z3_config()は抽象です。mk_configは静的でネイティブです。だから私もそれを解決することはできません....実際には、dllを見つけるためのパラメータとしてNative.loadLibrary関数へのパスを渡す必要があると思いました。dllをJavaクラスと同じパスに配置します。これは紛らわしく、私も間違っていると思います。
では、JNAeratorが生成したインターフェイスをインスタンス化する正しい方法は何でしょうか。