2015-04-02 65 views
1

我已經搜索了很長時間,沒有任何幫助。沒有得到C++結構使用JNA

編輯:這是實施技術圖像的建議後的代碼。

實施例結構C++代碼:

typedef struct _SOMESTRUCT{ 
    const char* String1; 
    const char* String2; 
} SOMESTRUCT, *LPSOMESTRUCT; 

實施例C++函數, 「填滿」 數據的結構:

int GetSomeStruct(_SOMESTRUCT somes); 

結構的翻譯成Java:

public class SomeStruct extends Structure{ 
    public String String1; 
    public String String2; 
    public class ByValue extends SomeStruct implements Structure.ByValue{} 
    public SomeStruct(Pointer p){ //constructors of struct 
     super(p); 
     read(); 
    } 
    public SomeStruct(){ 
     super(); 
     read(); 
    } 
} 

翻譯對java方法的功能:

int GetSomeStruct(SomeStruct.ByValue structref); 

如何,我從主要的Java應用程序執行代碼:嘗試使用該功能前

  • 我已經正確地執行Native.loadLibrary:

    EnclosingClass.SomeStruct sstruct = enclosingInstance.new SomeStruct(); 
    EnclosingClass.SomeStruc.ByValue sstructval = sstruct.new ByValue(); 
    enclosingInstanceofClasswithTranslatedCfunctions.GetSomeStruct(sstructref); 
    

    假設。 (更簡單的函數,返回int的工作正常,因爲接收事件通知的回調函數)

  • java翻譯都是在嵌套在擴展JNA庫的公共類中的單獨文件中(如在c代碼中)。
  • GetSomeStruct返回的int如果在c端執行得很好,則爲零。我一直得到零。

回答

1

您的本地聲明通過值傳遞結構。下面的聲明是等價的:

int GetSomeStruct(struct _SOMESTRUCT somes); 
int GetSomeStruct(SOMESTRUCT somes); 

您需要定義您的Java映射,明確接受一個實現了Structure.ByValue接口的參數。 JNA默認採用struct*,所以您需要明確的ByValue用法來表明您需要不同的東西。

public class MyStruct extends Structure { 
    public class ByValue extends MyStruct implements Structure.ByValue { } 
} 

SOMESTRUCTstruct _SOMESTRUCT一個typedef,這是指的是struct的最根本途徑。兩者都是類型說明符,可以互換使用。 _SOMESTRUCT通常被稱爲它在前面的結構定義的「標籤」。

+0

因此,我應該向java結構添加一個ByValue類,並將它傳遞給c函數的java映射,該函數應該被編輯爲接受Structure.ByValue參數? 在GetSomeStruct的第一個例子中,爲什麼括號中有三個單詞? 另外,有沒有一本書可以推薦與JNA打交道? – user3779674 2015-04-03 07:22:55

+0

是的,你需要指定「按值」('struct')語義而不是「通過引用」('struct *')。我不知道有任何JNA書籍,但[項目文檔](https://github.com/twall/jna)非常詳盡,歡迎提交[jna-users郵件列表]上的改進和問題http://groups.google.com/group/jna-users)。 – technomage 2015-04-03 11:08:27

+0

不知道我錯過了什麼。我刪除了「通過引用」,並添加了「值」空封閉的類,但該函數仍然沒有寫入任何數據到該結構創建的對象。 – user3779674 2015-04-04 16:46:51