Метод GetByteArrayElements не может гарантировать, что ваша программа использует ссылку или копию.JNI возвращает флаг isCopy для состояния, в котором он скопировал объект или закрепил его (pin означает ссылку).Если вы не хотите копировать его никогда, вам не нужно использовать методы GetArrayElements, потому что он всегда возвращает копию (JVM решает, копировать или нет, и, вероятно, копирование предпочтительнее, потому что копирование облегчает работу сборщика мусора).Я попробовал это и увидел, что мой баран увеличился при отправке большого массива.Вы также можете видеть, что по ссылке ниже:
IBM copy и pin (посмотрите на объект копирования и pin из дерева)
Как сказано в документе, GetPrimitiveArrayCritical возвращает прямоеадрес кучи массива Java, отключая сборку мусора до тех пор, пока не будет вызван соответствующий ReleasePrimitiveArrayCritical.Таким образом, вы должны использовать этот GetPrimitiveArrayCritical, если вы не хотите копировать (вам это нужно, когда у вас большой массив).Если мы посмотрим на ваш код, вы можете получить массив один за другим, как показано ниже (я предположил, что вы отправили массив int в качестве задания для функции JNI):
length = (*env)->GetArrayLength(jbIn);
bufferIn = (*env)->GetPrimitiveArrayCritical(env, jbIn, NULL);
for(int i=0; i<length; i++)
printf("Value of jbIn[%d]: %d", i, bufferIn[i]);
(*env)->ReleasePrimitiveArrayCritical(env, jbIn, bufferIn, 0);
Важное примечание: вы не можете получить GetArrayLength после GetPrimitiveArrayCritical, потому что JNIне позволяет программе вызывать какую-либо функцию JNI для одного и того же объекта между методами получения критического значения и выпуска.