2013-04-15 16 views
6

Sto caricando una DLL C da un programma scritto in Java. Voglio essere in grado di chiamare uno dei metodi della DLL con questa dichiarazione:Converti puntatore vuoto ** a tipo Java equivalente

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

Come chiamare questo metodo con argomenti di tipo corretto in Java? So (teoricamente) come chiamarlo, ma quello che vorrei sapere è come passare il "void **" e "size_t *" dal mio programma Java? In sostanza, voglio sapere ciò che il "tipo equivalente" per vuoto e size_t *** è in Java ...

ho trovato la classe Pointer, ma non sono riuscito a farlo funzionare? Molte grazie :)

+0

Non è così. I concetti non sono mappabili. Devi capire come saranno usati i valori e "imbrogliare". O scrivi un wrapper C. –

risposta

1

Il numero size_t è un numero intero utilizzato per la dimensione di una variabile in memoria; come tale dovresti essere sicuro usando unsigned long in Java.

Il void* è probabilmente un puntatore a un oggetto di tipo sconosciuto. This question, è abbastanza interessante in materia. In Java Object viene in genere utilizzato in questo caso, ma non so come si converte tra di loro, anche se this question potrebbe esserci d'aiuto.

+0

Non c'è 'unsigned long' in Java ... –

+0

Ah, buon punto. In questo caso, 'long' nel codice a 32 bit (dato che è un intero con segno a 64 bit) o' BigInteger' nel codice a 64 bit. Pensandoci, fai il log in quanto in realtà non fai nulla con esso nel codice Java potresti riuscire a farla franca anche solo con un lungo indirizzamento a 64-bit, a patto che la conversione tra Java e il linguaggio nativo non funzioni manometterlo e reinterpretare il file binario come se fosse un size_t. – Alan

+1

Ho letto il codice sorgente JDK. 'long' è usato per memorizzare" oggetti peer "nello stesso JDK (cerca' AWTObject' e cerca il puntatore 'pData' se sei interessato). Anche il sorgente Android usa 'long' per lo stesso scopo. Quindi penso che usare "long" sia la migliore pratica. –

1

Ho lavorato a un progetto Java/JNI/C diversi anni fa e abbiamo dovuto mantenere puntatori C opachi all'interno di oggetti Java. Abbiamo utilizzato i valori long sul lato Java per contenere i puntatori C, che sono stati convertiti dal lato JNI da jlong a void* o qualsiasi altro tipo di puntatore necessario.

Poiché il tipo Java long è largo 64 bit e i puntatori JNI/C sono in genere a 32 bit o 64 bit di larghezza, non abbiamo avuto problemi a convertire tra di essi.

0

ho cercato delle soluzioni, ma immagino non ho davvero capito bene ... Ma ho risolto il problema usando questo:

import com.sun.jna.ptr.IntByReference; 

Ho chiamato la funzione C del genere nel mio programma Java:

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

La funzione C "myCFunction" assomiglia a questo:

void myCFunction(void** parameter); 

È OK farlo? Funziona, ma mi chiedevo se fosse un modo corretto per farlo.