I am using this library to use communicate with a DLL, I don't have the source code, I just have the example about how is called this dll using Visual Basic, here the declaration in Visual Basic:
Declare Function fiOpenPort Lib "pinpadbox.dll" (ByRef ConfigFileName As String) As Short
Declare Function fiClosePort Lib "pinpadbox.dll" () As Short
Declare Function fiStartOperation Lib "pinpadbox.dll" (ByRef pucTipoOperation As String, ByRef iTimeOut As Short, ByRef pucResponse As String) As Short
Declare Function fiGetStatus Lib "pinpadbox.dll" (ByRef sBuffer As String, ByVal SizeBuffer As Short) As Short
And with that in mind I created this header file:
#ifndef PINPADBOX_H_
#define PINPADBOX_H_
class __declspec(dllimport) PINPADBOX
{
public:
PINPADBOX(); // Class Constructor
~PINPADBOX(); // Class destructor
short fiOpenPort(char**); // Class function fiOpenPort
short fiClosePort(); // Class function Subtract
short fiStartOperation(char**,short*,char**);
short fiGetStatus(char **,short);//I tested char & but no returns.
};
#endif /* PINPADBOX*/
I used JNAerator 0.13, the problem starts with the method fiGetStatus, because the first parameter a String by reference and each certain time update the value, sometimes I run the same lines of code and its run without problems, run again and the JVM crash showing problem on bridj.dll, this occurs at the moment the first variable returns with results. Here part of the code:
Pointer<Pointer<Byte>> getStatusPARAM1 = Pointer.pointerToCStrings("");
PINPADBOX box = new PINPADBOX();
short y2=0;
do{
getStatusPARAM1.get().set(Byte.parseByte("0")); //I tested with getStatusPARAM1.pointerToCString("")/getStatusPARAM1.set(Pointer.pointerToCString(""));/without this line and the same error
y2 = box.fiGetStatus(getStatusPARAM1, Short.valueOf("512"));
if(y2 > 0){
for(int i=0;i<getStatusPARAM1.get().getByteBuffer(y2).remaining();i++){
String obtByte = String.valueOf((char)getStatusPARAM1.get().getByteBuffer(y2).get(i));
strBu.append(obtByte);
}
if(strBu.lastIndexOf("C1")>0){
break;
}
}while(resultStartOper>=0);
getStatusPARAM1.release();
The hs_err_pid is:
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x502a7c7a, pid=14540, tid=0x00005778
C [bridj.dll+0x17c7a]
Current thread (0x0013cc00): JavaThread "main" [_thread_in_native, id=22392, stack(0x00640000,0x00690000)]
siginfo: ExceptionCode=0xc0000005, reading address 0x00000000
Register to memory mapping:
EAX=0x00000000 is an unknown value
EBX={method} {0x14c31aec} 'fiGetStatus' '(JS)S' in 'pinpadbox/PINPADBOX'
ECX=0x00000000 is an unknown value
EDX=0x15080a98 is an unknown value
Stack: [0x00640000,0x00690000], sp=0x0068f474, free space=317k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [bridj.dll+0x17c7a]
C [bridj.dll+0x3f04]
C [bridj.dll+0x1a34]
C [bridj.dll+0xb903]
j pinpadbox.PINPADBOX.fiGetStatus(JS)S+0
j pinpadbox.PINPADBOX.fiGetStatus(Lorg/bridj/Pointer;S)S+6
j test.BridJCard.main([Ljava/lang/String;)V+380
Internal exceptions (10 events):
Event: 0.781 Thread 0x0013cc00 Exception <a 'java/lang/NoSuchMethodError': fiGetStatus> (0x04a53150) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\prims\jni.cpp, line 1613]
Event: 0.781 Thread 0x0013cc00 Exception <a 'java/lang/NoSuchMethodError': fiClosePort> (0x04a53398) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\prims\jni.cpp, line 1613]
Event: 0.795 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04ab9710) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.812 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b37ed8) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.813 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b39620) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.813 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b3b1e0) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.813 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b3c450) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.814 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b3eca0) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.814 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b40778) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Event: 0.814 Thread 0x0013cc00 Exception <a 'java/lang/ArrayIndexOutOfBoundsException'> (0x04b419c8) thrown at [C:\re\workspace\8-2-build-windows-i586-cygwin\jdk8u112\7884\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605]
Could you get me some clue to resolve this? I guess at the moment to recover the data, doesn't match the size of the field.... but I'm not sure.
Hi guys,
I am using this library to use communicate with a DLL, I don't have the source code, I just have the example about how is called this dll using Visual Basic, here the declaration in Visual Basic:
Declare Function fiOpenPort Lib "pinpadbox.dll" (ByRef ConfigFileName As String) As Short Declare Function fiClosePort Lib "pinpadbox.dll" () As Short Declare Function fiStartOperation Lib "pinpadbox.dll" (ByRef pucTipoOperation As String, ByRef iTimeOut As Short, ByRef pucResponse As String) As Short Declare Function fiGetStatus Lib "pinpadbox.dll" (ByRef sBuffer As String, ByVal SizeBuffer As Short) As Short
And with that in mind I created this header file:
I used JNAerator 0.13, the problem starts with the method fiGetStatus, because the first parameter a String by reference and each certain time update the value, sometimes I run the same lines of code and its run without problems, run again and the JVM crash showing problem on bridj.dll, this occurs at the moment the first variable returns with results. Here part of the code:
The hs_err_pid is:
Could you get me some clue to resolve this? I guess at the moment to recover the data, doesn't match the size of the field.... but I'm not sure.
Thanks in advance