2013-04-15 17 views
6

Ładowanie biblioteki DLL z programu napisanego w języku Java. Chcę móc wywołać jedną z metod z DLL z niniejszym oświadczeniem:Konwertuj void ** wskaźnik na równoważny typ Java

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

Jak mogę nazwać tę metodę z argumentami odpowiedniego typu w Java? Wiem (teoretycznie) jak to nazwać, ale chciałbym wiedzieć, jak przekazać "void **" i "size_t *" z mojego programu Java? Zasadniczo Chcę wiedzieć, co „odpowiednik typu” za nieważne i size_t *** jest w Javie ...

znalazłem klasę wskaźnika, ale nie udało nam się dostać to działa? Wielkie dzięki :)

+0

Nie. Pojęć nie można mapować. Musisz zrozumieć, w jaki sposób wartości będą używane i "oszukiwać". Lub napisz opakowanie C. –

Odpowiedz

1

Numer size_t jest liczbą całkowitą używaną dla wielkości zmiennej w pamięci; jako takie powinno być bezpieczne przy użyciu unsigned long w Javie.

Obiekt void* jest prawdopodobnie wskaźnikiem do obiektu nieznanego typu. This question, jest dość interesujący w tej sprawie. W języku Java Object jest zwykle używany w tym przypadku, ale nie wiem, w jaki sposób można je przekonwertować, chociaż może tam pomóc this question.

+0

Nie ma "unsigned long' w Java ... –

+0

Ah, dobry punkt. W takim przypadku 'long' w kodzie 32-bitowym (ponieważ jest to 64-bitowa liczba całkowita ze znakiem) lub' BigInteger' w 64-bitowym kodzie. Myśląc o tym, więc loguj się, tak jak nie robisz nic z tym w kodzie Java, możesz być w stanie uciec z długimi adresami 64-bitowymi, tak długo, jak konwersja między Javą a językiem ojczystym nie działa Modyfikuje go i może reinterpretować plik binarny tak, jakby był size_t. – Alan

+1

Przeczytałem kod źródłowy JDK. 'long' służy do przechowywania" obiektów peer "w samym JDK (szukaj' AWTObject' i poszukaj wskaźnika 'pData', jeśli jesteś zainteresowany). Źródło Androida również używa słowa "long" w tym samym celu. Myślę więc, że używanie 'long' jest najlepszą praktyką. –

1

Pracowałem nad projektem Java/JNI/C kilka lat temu, a my musieliśmy utrzymywać nieprzezroczyste wskaźniki C w obiektach Java. Użyliśmy wartości long po stronie Java, aby pomieścić wskaźniki C, które zostały przekonwertowane po stronie JNI z jlong na void* lub dowolny typ wskaźnika, który potrzebowaliśmy.

Ponieważ typ Java long ma szerokość 64 bitów, a wskaźniki JNI/C są zazwyczaj 32-bitowe lub 64-bitowe, nie mieliśmy żadnych problemów z konwersją między nimi.

0

próbowałem swoich rozwiązań, ale myślę, że nie bardzo rozumiem ... Ale mój problem rozwiązany za pomocą tego:

import com.sun.jna.ptr.IntByReference; 

Zadzwoniłem do funkcji C takiego w moim programie Java:

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

funkcja C "myCFunction" wygląda następująco:

void myCFunction(void** parameter); 

Czy można to zrobić? Działa, ale zastanawiałem się, czy to właściwy sposób.

Powiązane problemy