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端執行得很好,則爲零。我一直得到零。
因此,我應該向java結構添加一個ByValue類,並將它傳遞給c函數的java映射,該函數應該被編輯爲接受Structure.ByValue參數? 在GetSomeStruct的第一個例子中,爲什麼括號中有三個單詞? 另外,有沒有一本書可以推薦與JNA打交道? – user3779674 2015-04-03 07:22:55
是的,你需要指定「按值」('struct')語義而不是「通過引用」('struct *')。我不知道有任何JNA書籍,但[項目文檔](https://github.com/twall/jna)非常詳盡,歡迎提交[jna-users郵件列表]上的改進和問題http://groups.google.com/group/jna-users)。 – technomage 2015-04-03 11:08:27
不知道我錯過了什麼。我刪除了「通過引用」,並添加了「值」空封閉的類,但該函數仍然沒有寫入任何數據到該結構創建的對象。 – user3779674 2015-04-04 16:46:51