Я провел большую часть утра, пытаясь заполнить и передать массив заполненных структур на C ++ из Java с помощью JNA. У меня есть значительная часть кода на основе JNA, и я чувствую, что это должно быть просто, но я не могу понять или найти пример, который не использует функции @deprecated. Я подозреваю, что это тривиально, и я буду чувствовать себя глупо, когда кто-то покажет мне, но я был бы очень признателен за помощь.
Немного предыстории того, что я пробовал:
Я почему-то сомневаюсь, что это важно, но после того, как я научился писать файлы интерфейса вручную (и заставил их работать), я переключился на JNAerator. JNAerator переводит
MyStruct* mine
в
MyStruct mine
на Яве. Это немного смущает меня, потому что в Java это можно использовать только для указания на один объект. В какой-то момент я посмотрел на использование
MyStruct** mine
что переводится как
PointerByReference mine
Но это кажется излишним, потому что мне не нужно изменять структуры или когда-либо снова обращаться к ним в этом отношении. С этого момента я перепробовал все, что мог придумать, но мне так и не удалось успешно отправить больше, чем первая структура.
Перечитав свой вопрос (передайте структуры из Java в C ++), вот что вы можете сделать:
// Assuming a native signature like this:
// call_native_function(MyStruct** struct_list, int count)
MyStruct.ByReference[] list = new MyStruct.ByReference[SIZE];
for (int i=0;i < list.length;i++) {
list[i] = new MyStruct.ByReference();
// Initialize the struct as needed
}
// Call whatever native method...
nativeLibrary.call_native_function(list, list.length);
Смотрите также JNA FAQ.
Других решений пока нет …