У меня есть byte[]
в Java, который сообщает его длину в 256 байтов, которую я передаю нативной функции в C.
Когда я пытался вытащить данные из этого массива, это было совершенно неправильно, и когда я их распечатывал, они не соответствовали данным, которые я распечатал, перед тем как передать их в C.
Я пробовал несколько способов получить доступ к данным, включая GetByteArrayRegion
и GetByteArrayElements
, но, похоже, ничто не дает мне ожидаемых данных.
Когда я исследовал это, я попытался выяснить, что, по мнению JNI, длина jbyteArray
была с GetArrayLength
- она сообщила, что длина равна 1079142960, что намного больше, чем ожидалось в 256 байтах. Кроме того, значение было разным при каждом вызове функции, например, в другой раз GetArrayLength
вернул 1079145720.
Вот код, который я использую для доступа к массиву:
JNIEXPORT jbyteArray function(JNIEnv* env, jbyteArray array) {
int length = (*env)->GetArrayLength(env, array);
jbyte data[256];
(*env)->GetByteArrayRegion(env, array, 0, 256, data);
//also tried
//jbyte *data = (jbyte*) (*env)->GetByteArrayElements(env, array, NULL);
}
Это кажется довольно прямым, поэтому я не совсем уверен, что происходит. Массив выглядит нормально из Java, но он был сгенерирован в C и передан обратно, поэтому я полагаю, что там что-то пошло не так, что Java не заботится, но разбивает массив, когда он возвращается к C.
Вот код, который я использовал для генерации массива и передачи его обратно в Java:
//there is some openSSL stuff here that sets up a pointer to an RSA struct called keys that is size bytes large
jbyteArray result = (*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, result, 0, size, (jbyte*)keys;
Я что-то упустил?
Спасибо