[英]Java and JNA passing params for C function
我正在使用JNA從C DLL調用函數:
extern _declspec( dllexport )
int ReadCP(IN OUT unsigned char* Id, IN OUT unsigned int* Size);
在Java中,我通過這種方法將接口用於JNA:
int ReadCP(byte[] id, IntByReference size);
我成功加載DLL並以這種方式調用方法:
byte[] id= new byte[10];
IntByReference size = new IntByReference();
IMimicDLL demo = (IMimicDLL) Native.loadLibrary("MyLib", IMimicDLL.class);
size.setValue(10);
//....
while(true){
demo.ReadCP(id, size);
//...
}
循環id
的第一次有一個正確的值,但是即使邏輯更改了它,它也會保持相同的值。 可能是什么問題? 這和指針有關嗎?
您的id
映射是錯誤的:您無法通過JNA將基本數組作為參數傳遞。
您應該更改接口以使用Pointer
:
int ReadCP(Pointer id, IntByReference size);
然后,您將為ID分配本機端內存:
Pointer id = new Memory(10);
從函數傳遞並檢索id
后,您將從本地內存中獲取字節數組:
byte[] idByteArray = id.getByteArray(0, 10);
還有其他Pointer
get*()
方法 ,例如getString()
,該方法可能或可能不更適用於您要獲取的Id
字段的最終類型。
至於一次更新值,而不是在重復調用后不更新,這聽起來像是在某個時候系統正在獲取當前硬件狀態的“快照”,您必須找到一種刷新快照的方法。 故障排除步驟包括:
size
變量,以確保它保持期望的值10。 可能是,當您取出卡時,它可能返回0,然后,如果您嘗試讀取一個新的值(長度為0),則不會覆蓋索引0之后的舊數組。 這些步驟中的大多數都超出了使用JNA的問題范圍,可能需要您提供有關正在使用的DLL的更多信息,以便我們提供進一步的幫助。
這是while循環中的企業登錄
while(true){
try {
Thread.sleep(1500);
} catch (InterruptedException e1)
{
e1.printStackTrace();
}
if(demo.cardPresent() == 0 && read == false){
demo.ReadCP(id, size);
try {
System.out.println(" -- id : " + new String(id.getByteArray(0, 10),"UTF-8"));
read = true;
continue;
} catch (Exception ex) {
ex.printStackTrace();
}
}else if(demo.cardPresent() != 0){
read = false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.