0
我對需要訪問的某個庫有C頭。所以我使用JNAerator來完成代碼的無聊轉換 - 在我讀到人們推薦它之後。好像是從我所看到的相當紮實:將C頭文件包裝成與dll和JNA一起使用(erator)
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是靜態的和本地的。所以我不能解決這個要麼....實際上我認爲需要將Path作爲參數傳遞給Native.loadLibrary函數來查找dll。我把dll放在和Java類相同的路徑中。這是令人困惑的,我懷疑也是錯誤的。
那麼什麼是實例化JNAerator生成的接口的正確方法?
它看起來像JNAErator無法完全解析你的頭。什麼是Z3_config?發佈標題以及。 – 2011-05-26 08:05:01
https://github.com/wishi/z3_api/blob/master/src/main/java/z3_api/z3_api.h我把它放在這裏......我不一定會被JNAerator實際綁定。與Swig相反,這個用例似乎很簡單。 – wishi 2011-05-26 09:24:36