JNI: как получить размер jbyteArray - PullRequest
10 голосов
/ 07 июня 2011

Фон

Я работаю с байтовыми массивами в JNI .И я не могу получить длина из jbyteArray .Я пишу код в eclipse в Windows 7 .

Java-код:

private native int Enroll( byte[] pSeed );

Код JNI:

В JNI у меня есть структура, состоящая из двух членов unsigned long length иunsigned char data[1]

typedef struct blobData_s {
    unsigned long     length;
    unsigned char     data[1];
} blobData_t;

Теперь, когда моя функция JNI получает в качестве аргумента jbyteArray jpSeed, я хочу получить длину jpSeed и установить ее в качестве члена длины структуры.

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     bd->length = **Question 1**
     bd->data[1] = jbyteArray;
}

Вопрос 1: Как я могу получить длину jpSeed в JNI?

Вопрос 2: Будет ли этот кодработает правильно bd.data[1] = jbyteArray;?

Ответы [ 2 ]

28 голосов
/ 07 июня 2011
  1. Вы можете использовать GetArrayLength(JNIEnv* env, jbyteArray array) Чтение здесь .

  2. Не уверен, что вы хотите сделать, я предполагаю, что вы хотите содержание jpSeed в bd.data[1].В любом случае, доступ к содержимому байтового массива должен быть выполнен с помощью GetByteArrayElements(...).

3 голосов
/ 07 июня 2011

Решение

Ответ на вопрос 1. Поскольку jpSeed равно jbyteArray, это означает, что вы можете получить его длину, вызывая GetByteArrayElements( ... ) функции, которыезаявлено в JNI (вы можете прочитать документацию здесь ) здесь правильный код будет:

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     bd->length = (*env)->GetArrayLength( env, jpSeed );
     .......
}

Ответ на вопрос 2. Этот bd->data[1] = jbyteArray; код неверен, так как он не будет скомпилирован. Правильное решение для этой части:

JNIEXPORT jint JNICALL Java_com_Test_Enroll( JNIEnv* env, jobject thiz, jbyteArray jpSeed ){
     blobData_t* bd = malloc( sizeof(blobData_t) );
     .......
     jbyte* bytes = (*env)->GetByteArrayElements( env, jpSeed, 0 );
     bd->data[1] = bytes[1];
}

И не забудьте выпустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...