I have a code in C# that calls methods from dll. Now what I want to achieve that in Java.
C#
[DllImport("dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int FindNumber([MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 64)] string atr, out IntPtr number);
[DllImport("dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int GetData(int number, int dataId, byte[] dataBuffer, ref uint dataBufferSize);
int res=0;
IntPtr number=IntPtr.Zero;
res = FindNumber(null, out number);
uint dataBufferSize = 1024;
byte[] dataBuffer = new byte[dataBufferSize];
res = GetData(number, 6, dataBuffer, ref dataBufferSize);
Console.WriteLine(Encoding.UTF8.GetString(dataBuffer, 0, (int)dataBufferSize));
Java
LongByReference number = new LongByReference(0);
int res=0;
res = NativeInterface.FindNumber(null, number);
IntByReference dataBufferSize = new IntByReference(1024);
Pointer dataBuffer = new Memory(1024);
res = NativeInterface.GetData(number.getValue(), 6, dataBuffer, dataBufferSize);
if (res == 0) {
byte buffer[] = dataBuffer.getByteArray(0, dataBufferSize.getValue());
String bufferContent = new String(buffer, StandardCharsets.UTF_8);
System.out.println(bufferContent);
}
If res is 0 it means that everything is Ok. After GetData() res is 0 but dataBufferSize is 1024, in C# is 8 and bufferContent=?;
If I do it like this
LongByReference number = new LongByReference(0);
int res=0;
res = NativeInterface.FindNumber(null, number);
IntByReference dataBufferSize = new IntByReference(1024);
byte[] dataBuffer = new byte[dataBufferSize.getValue()];
res = NativeInterface.GetData(number.getValue(), 6, dataBuffer, dataBufferSize);
if (res == 0) {
String bufferContent = new String(dataBuffer, StandardCharsets.UTF_8);
System.out.println(bufferContent);
}
res is 0, but bufferContent="",dataBufferSize is 1024 and dataBuffer is full of 0
Now it works, I didn't include dll.lic in my project
Pointer number;
PointerByReference ref=new PointerByreference();
int res=0;
res = NativeInterface.FindNumber(null, ref);
number=ptr.getValue();
IntByReference dataBufferSize = new IntByReference(1024);
Pointer dataBuffer = new Memory(1024);
res = NativeInterface.GetData(number, 6, dataBuffer, dataBufferSize);
if (res == 0) {
byte buffer[] = dataBuffer.getByteArray(0, dataBufferSize.getValue());
String bufferContent = new String(buffer, StandardCharsets.UTF_8);
System.out.println(bufferContent);
}