0

アクセスする必要のある特定のライブラリへの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が生成したインターフェイスをインスタンス化する正しい方法は何でしょうか。

4

1 に答える 1

1

投稿したヘッダーは、Z3_config が何であるかを定義していません。DEFINE_TYPE(Z3_config); とだけ書かれています。このヘッダーには、有効なバインディングを生成するための十分な情報がありません。ヘッダーをクリーンアップし、すべての #ifdef などを削除し、それらの型が実際にどうあるべきかを含めてから、コードの生成を再試行してください。

于 2011-05-26T10:10:48.607 に答える