2011-05-26 61 views
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生成的接口的正確方法?

+0

它看起來像JNAErator無法完全解析你的頭。什麼是Z3_config?發佈標題以及。 – 2011-05-26 08:05:01

+0

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

回答

1

您發佈的標題沒有定義Z3_config的內容,它只表示DEFINE_TYPE(Z3_config);此標頭沒有足夠的信息來生成有效的綁定。清理標題,刪除所有#ifdef等,包括那些類型實際應該是什麼,然後再次嘗試生成代碼。