Я пишу приложение Java, которое будет иметь доступ к C++ dll usnig JNA. Поэтому я подготовил C dll для связи между dll JNA и C++ thrid. У меня есть эти два структур: кодКак передать структуру, содержащую char * в java, используя JNA и избежать копирования данных?
C:
struct Struct1
{
uint32_t Size;
unsigned char* Data;
};
struct Struct2
{
uint32_t Struct1_Nbr;
Struct1* struct1_elements;
};
bool Open(char* fileName, Struct2** struct2);
Теперь я пишу соответствующую ЮНУ коды приложения Java, и я хочу, чтобы получить доступ к «неподписанному символу * Data» без копирования этих данных, как это большое количество данных. Как я могу использовать типы «Память» или «Указатель» для выполнения этой задачи?
Вот моя попытка:
public class Test
{
public static class Struct1 extends com.sun.jna.Structure {
public Struct1(){}
public Struct1(Pointer pointer){
super(pointer);
read();
}
public static class Struct1ByValue extends Struct1 implements com.sun.jna.Structure.ByValue{};
public int Size;
public Memory Data;
public static class Struct1ByReference extends Struct1 implements com.sun.jna.Structure.ByReference{}
@Override
protected List getFieldOrder() {
// TODO Auto-generated method stub
return Arrays.asList("Size", "Data");
};
public static class Struct2 extends com.sun.jna.Structure {
public Struct2(){}
public Struct2 (Pointer pointer){
super(pointer);
read();
}
public int Struct2_Nbr;
public Struct1.Struct1ByReference struct1_elements = new Struct1.Struct1ByReference();
public static class Struct2ByValue extends Struct2 implements com.sun.jna.Structure.ByValue{};
public static class Struct2ByReference extends Struct2 implements com.sun.jna.Structure.ByReference{}
@Override
protected List getFieldOrder() {
// TODO Auto-generated method stub
return Arrays.asList("Struct1_Nbr", "struct1_elements"));
};
}
public interface StructureProtocol extends com.sun.jna.Library{
Boolean Open(String fileName, PointerByReference struct2);
}
public StructureProtocol lib;
public Test(){
this.lib = (StructureProtocol) Native.loadLibrary("TestAPI", StructureProtocol.class);
}
public static void main(String[] args) {
Test test = new Test();
PointerByReference pref = new PointerByReference();
test.lib.Open("filePath", pref);
Pointer ptr = pref.getValue();
Struct2 struct2= new Struct2(ptr);
Struct1[] struct1_array= (Struct1[])(struct2.struct1_elements).toArray(struct2.struct1_Nbr);
System.out.println("struct1_array[0]: Size = " + struct1_array[0].Size);
System.out.println("struct1_array[0]: Data= " + struct1_array[0].Data);
}
}
Любые советы будут очень высокую оценку.
Какова твоя роль? Ошибка? Неожиданный результат? – Alex
Я получаю ожидаемый результат: System.out.println ("Struct2.struct1_Nbr ==" + struct2.struct1_Nbr); возвращает Struct2.struct1_Nbr == 0. поэтому у меня есть exeption в этой инструкции «Struct1 [] struct1_array = (Struct1 []) (struct2.struct1_elements) .toArray (struct2.struct1_Nbr);" – benayedh