Получение нулевого байтового массива в Java из JNI - PullRequest
5 голосов
/ 27 апреля 2011

Я вызываю нативную функцию из Java для возврата байта [].
Ниже приведен фрагмент кода JNI

jbyteArray result;  
jbyte *resultType;  
result = (*env)->NewByteArray(env, 1);  
*resultType =7;
(*env)->SetByteArrayRegion(env, result, 0, 1, resultType);    
return result;

Предполагается, что для создания байтового массива длины 1 в нем сохраняется значение 7. Мой реальный код должен создать массив динамической длины, но я получаю ту же проблему, что и в этом примере.

Теперь перейдем к моей проблеме - в Java массив, возвращаемый из JNI, равен нулю. Что я делаю неправильно? Любая помощь будет оценена.

1 Ответ

7 голосов
/ 27 апреля 2011

Прототип для SetByteArrayRegion():

void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);

Последний аргумент - буфер памяти, из которого SetByteArrayRegion() будет скопирован в массив Java.

Вы никогда не инициализируете этот буфер. Вы делаете:

jbyte* resultType;
*resultType = 7; 

Я удивлен, что вы не получаете дамп ядра, поскольку вы записываете 7 в какое-то случайное место в памяти. Вместо этого сделайте это:

jbyte theValue;
theValue = 7;
(*env)->SetByteArrayRegion(env, result, 0, 1, &theValue);

В целом,

// Have the buffer on the stack, will go away
// automatically when the enclosing scope ends
jbyte resultBuffer[THE_SIZE];
fillTheBuffer(resultBuffer);
(*env)->SetByteArrayRegion(env, result, 0, THE_SIZE, resultBuffer);

или

// Have the buffer on the stack, need to
// make sure to deallocate it when you're
// done with it.
jbyte* resultBuffer = new jbyte[THE_SIZE];
fillTheBuffer(resultBuffer);
(*env)->SetByteArrayRegion(env, result, 0, THE_SIZE, resultBuffer);
delete [] resultBuffer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...