2013-04-15 53 views
6

我正在用Java編寫的程序加載C DLL。 我希望能夠調用從DLL的方法與此聲明中的一個:將void **指針轉換爲等效的Java類型

dll_function(const char* foo1, const char* foo2, const char* foo3, void** bar, size_t* bar2); 

如何調用該方法在Java中正確類型的參數?我知道(理論上)如何調用它,但是我想知道的是如何從我的Java程序中傳遞「void **」和「size_t *」?基本上,我想知道什麼是「同等類型」爲無效類型和size_t ***是Java......

我發現指針類,但沒能得到它的工作? 非常感謝:)

+0

你不知道。這些概念是不可映射的。你必須瞭解這些價值將如何被使用和「欺騙」。或者寫一個C包裝器。 –

回答

1

size_t是一個整數,用於存儲器中變量的大小;因此,您應該使用Java中的unsigned long安全。

void*很可能是指向未知類型對象的指針。 This question,在這件事上相當有趣。在這種情況下,通常使用Java Object,但我不知道如何在它們之間進行轉換,儘管this question可能對此有所幫助。

+0

Java中沒有'unsigned long' ... –

+0

啊,好點。在這種情況下,32位代碼中的「long」(因爲它是64位有符號整數)或64位代碼中的BigInteger。關於它的思考,所以登錄,你實際上並不在Java代碼中對它做任何事,你也許能夠矇混過關只是一個長64位尋址太多,只要和本地語言的Java沒有按之間的轉換不會破壞它,並且可以重新解釋二進制文件,就好像它是一個size_t。 – Alan

+1

我讀了JDK源代碼。 'long'用於在JDK本身存儲「等對象」(搜索'AWTObject'並查找'pData'指針,如果你有興趣)。 Android源也使用'long'來達到同樣的目的。所以我認爲使用'長'是最好的做法。 –

1

幾年前,我在一個Java/JNI/C項目上工作過,並且我們不得不在Java對象中維護不透明的C指針。我們在Java端使用了long值來保存C指針,這些指針在JNI端從jlong轉換爲void*或我們需要的任何指針類型。

由於Java long類型是64位寬,並且JNI/C指針通常是32位或64位寬,所以我們在它們之間轉換時沒有任何問題。

0

我想你的解決方案,但我想我真的不正確地理解...... 但我用這個解決我的問題:

import com.sun.jna.ptr.IntByReference; 

我打電話一樣,在我的Java程序的C函數:

IntByReference myVoidPointerPointer = new IntByReference(); 
myCLibrary.myCFunction(myVoidPointerPointer); 

C函數 「myCFunction」 看起來是這樣的:

void myCFunction(void** parameter); 

可以這樣做嗎?它正在工作,但我想知道這是否是一個正確的方法。

相關問題