2016-01-13 102 views
1

嗯,我有在C以下代碼++的Java JNA取消引用指針

uintptr_t buf; 

if ((reason = vm_read(task, (uintptr_t) &start, sizeof(int), &buf, &bytesRead)) != KERN_SUCCESS) { 
    cout << "Failed to read: " << reason << endl; 
} 

cout << "Step 2 (after write, should = 100): " << (*(int *) buf) << endl; 

如果它打印在步驟2中,我DEREF的BUF指針,並轉換成它的int值。

我想知道如何使用JNA在Java中執行此操作?

我試過以下,但它不打印正確的值。

IntByReference o = new IntByReference(); 
    MemoryBuffer buffer = Cacheable.buffer(4); 
    System.out.println(mac.vm_read(process.task(), new Pointer(140734594927432L), 4, buffer, o)); 
    System.out.println(Pointer.nativeValue(buffer)); 

回答

1

爲了讀取正確的值,我只好先打電話buffer.getPointer(0).getInt()

例:

IntByReference o = new IntByReference(); 
MemoryBuffer buffer = Cacheable.buffer(4); 
System.out.println(mac.vm_read(process.task(), new Pointer(140734594927432L), 4, buffer, o)); 
System.out.println(buffer.getPointer(0).getInt()); 
+2

你真的應該使用'Memory'和明確分配您需要的緩衝區大小。使用'PointerByReference'可以爲你提供一個指針大小的緩衝區。 – technomage

+0

當使用「Memory」類給我錯誤的價值,就像我原來的問題。它返回'551456768(每次不同)'而不是實際值。使用'PointerByReference'修復了這個問題。 –

+0

顯示你的工作,並指出你的期望和錯誤,這將更容易準確地確定你錯誤的位置。 'PointerByReference'只是將特定的語義包裝在一個'Memory'緩衝區的周圍,所以說'Memory'失敗了,因爲'PointerByReference'工作不足。 – technomage