Search code examples
javaarrayspointersjna

C# byteArray to Java


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


Solution

  • 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);                              
        }