Добавить к байтовому массиву, используя swig - PullRequest
0 голосов
/ 01 февраля 2020

Я хотел бы добавить к 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 непосредственно в шаблоне%. Это довольно глупо.

1 Ответ

0 голосов
/ 02 февраля 2020

java массивы не могут расти. После этого их размер фиксируется. Единственный вариант - создать новый байтовый массив и вернуть его (и написать любой код, вызывающий ваш код, который не просто пропустит байтовый массив, но также заменит свою собственную переменную любой ты возвращаешься, если он этого не делает, ты ничего не можешь сделать).

...