2012-05-03 15 views
5

Ho una DLL che accetta un input di stringa codificato e lo decodifica. La DLL è stata creata su un Win7 a 64 bit utilizzando Codeblocks e mingw64. Il codice C funziona bene ma quando lo eseguo tramite JNA in un ciclo while con la stessa stringa viene decodificato correttamente per circa il 70% delle chiamate e per il resto è errato. Voglio eseguire il debug della situazione, ma non sono sicuro di come farlo dopo che il codice Java ha passato il controllo a JNA. In alternativa, qualsiasi idea su dove guardare sarà anche utile.JNA C DLL Debug Howto?

La firma di metodo in C e JNA sono i seguenti,

Java: int Decrypt_Blk(byte[] expkey, byte[] in, int size, byte[] out); 
C: __declspec (dllexport) int Decrypt_Blk (unsigned char *expkey, unsigned char *in, unsigned int insize, unsigned char *out); 

la correttezza è determinato dalla uscita, ad esempio, se prendo la stringa "helloworld" cifrare (non sto andando in dettagli di crittografia in quanto sono irrilevanti) quindi passare l'output crittografato a questo metodo DLL, 7 volte su 10 ottengo "HelloWorld" altre 3 volte otterrei caratteri errati e variabili. E per tutte le 10 volte sono nella stessa discussione usando la stessa variabile, nello stesso ciclo. Anche le 3 occorrenze errate sono casuali, l'unica cosa che posso notare è che la prima esecuzione è SEMPRE corretta più volte che ho provato, ma l'esecuzione scorretta si verifica in una qualsiasi delle corse 1-10.

+0

[controllare i collegamenti in basso] (http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html) – user1097489

+0

Come si determina il "correttezza" dell'operazione? Il primo posto da cercare sarebbe per gli errori di conversione tra unsigned e signed in input e output. – technomage

+0

Nota che la tua API sta facendo supposizioni sul formato dei dati '' expkey'', così come sulla dimensione del buffer '' out''. – technomage

risposta

4

In Microsoft Visual C++, dal progetto Impostazioni per il progetto DLL, è possibile selezionare la scheda Debug. Come eseguibile per la sessione di debug, fornire il percorso completo di Java.exe. Per gli argomenti, fornire il resto della riga di comando per eseguire l'app Java. Imposta i punti di interruzione nel tuo codice C e avvia la sessione di debug. Ecco!