2012-05-03 16 views
5

Tengo una DLL que toma una entrada de cadena codificada y la decodifica. La DLL se realizó en un Win7 de 64 bits utilizando Codeblocks y mingw64. El código C solo funciona bien, pero cuando lo ejecuto a través de JNA en un ciclo while con la misma cadena, se decodifica apropiadamente para aproximadamente 70% de llamadas y para el resto es incorrecto. Quiero depurar la situación, pero no estoy seguro de cómo hacerlo después de que el código de Java ceda el control a JNA. Alternativamente, cualquier idea sobre dónde buscar también será útil.JNA C DLL Debug Howto?

La firma del método en C y JNA son los siguientes,

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 corrección se determina por la salida, por ejemplo, si tomo la cadena "Hola Mundo" cifrar (no voy a la los detalles de encriptación ya que son irrelevantes) luego pasan la salida encriptada a este método DLL, 7 de cada 10 veces obtengo "HelloWorld" otras 3 veces obtengo caracteres incorrectos y variados. Y para las 10 veces estoy en el mismo hilo usando la misma variable, en el mismo ciclo. Las 3 apariciones incorrectas también son aleatorias, lo único que puedo notar es que la primera ejecución SIEMPRE es correcta tantas veces como he probado, pero la ejecución incorrecta ocurre en cualquiera de las 1-10 ejecuciones.

+0

[revise los enlaces en la parte inferior] (http://web.archive.org/web/20081210024620/http://www.kineteksystems.com/white-papers/mixedjavaandc.html) – user1097489

+0

¿Cómo está determinando el "corrección" de la operación? El primer lugar para buscar sería para los errores de conversión entre unsigned y signed en la entrada y salida. – technomage

+0

Tenga en cuenta que su API está haciendo suposiciones sobre el formato de los datos '' expkey'', así como el tamaño del búfer '' out''. – technomage

Respuesta

4

En Microsoft Visual C++, desde la Configuración del proyecto para el proyecto DLL, puede seleccionar la pestaña Depurar. Como el ejecutable de la sesión de depuración, proporcione la ruta completa de Java.exe. Para los argumentos, proporcione el resto de la línea de comando para ejecutar su aplicación Java. Establezca puntos de interrupción en su código C e inicie la sesión de depuración. Voila!