簡體   English   中英

Java和JNA為C函數傳遞參數

[英]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字段的最終類型。

至於一次更新值,而不是在重復調用后不更新,這聽起來像是在某個時候系統正在獲取當前硬件狀態的“快照”,您必須找到一種刷新快照的方法。 故障排除步驟包括:

  • 清除數組/指針中的數據,看看是否從C端DLL中重新填充了數據(問題不在JNA中,而是在使用DLL)。
  • 在整個過程中檢查您的size變量,以確保它保持期望的值10。 可能是,當您取出卡時,它可能返回0,然后,如果您嘗試讀取一個新的值(長度為0),則不會覆蓋索引0之后的舊數組。
  • 交替使用哪個卡。
  • 更改啟動程序,加載和交換卡的順序,以收集數據,該過程的哪個步驟似乎會使該值卡住。
  • 研究DLL的“刷新”或“重新加載”硬件狀態快照的方法。
  • 嘗試在兩次循環之間卸載和重新加載DLL

這些步驟中的大多數都超出了使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM