Я хотел бы добавить к Java байт [] из C ++, используя swig. Хитрость заключается в том, чтобы сделать это без вызова GetByteArrayElements, поскольку это сделало бы копию байта [], если byte [] не может быть закреплен.
Без swig, мы легко можем сделать это с помощью SetByteArrayRegion - записать число байтов к байту [] напрямую. Проблема с swig заключается в том, что:
находится код, который выполняет фактическую работу. cpp - например, прочитать содержимое файла и поместить его в строку fileContents. Код C ++ не имеет доступа к полям jni.
Код, который выполняет SetByteArrayRegion, находится в файле .i - он не имеет доступа к данным fileContents, созданным функцией c ++.
Я не смог найти ни одного примера для добавления данных, сгенерированных функцией c ++, в байт [] с помощью swig, без закрепления всего буфера и просто с помощью SetByteArrayRegion для копирования необходимых данных поверх.
Пример функциональности c ++ для достижения:
void append(char *s, int pos) {
char* fileContents = readFromFile();
strcat(s+pos, fileContents);
}
Возможное обходное решение:
В файле .i мы выполняем фактическую реализацию (вызываем readFromFile), а с этими результатами вызываем SetByteArrayRegion непосредственно в шаблоне%. Это довольно глупо.