Как привести uint8_t * к jbyteArray jni android - PullRequest
0 голосов
/ 17 мая 2018

Я работаю над библиотекой Android, которая использует некоторый код на языке c / c ++.

У меня, видимо, какая-то ошибка кодирования, которая возникает только во время выполнения.

Ошибка: JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0x7d61e62000

Это код JNI, который я использую для вызова кода C.

JNIEXPORT jbyteArray JNICALL
Java_com_comp_complibrary_api_initializeProduct(JNIEnv *env, jobject 
                                                    instance,
                                                    jbyteArray buffer_) {
    jbyte *buffer = env->GetByteArrayElements(buffer_, NULL);

    jbyteArray rv = (jbyteArray) initializeProduct((uint8_t *) buffer);

    env->ReleaseByteArrayElements(buffer_, buffer, 0);

    return rv;
}

initializeProduct возвращает uint8_t *.

Если я все правильно понимаю, тогда я смогу привести приведенное значение к jbyteArray, а затем присвоить его byte[] в одном из моих классов Java. Однако это не так.

byte[] defend = (byte[]) initializeProduct(bufferByteArray);

Вы заметите, что jbyteArray можно привести к uint8_t *, поскольку я передаю его в качестве параметра initializeProduct. Проходя через код c, я могу подтвердить, что это правда.

Как правильно конвертировать / кастовать uint8_t * в jbyteArray?

1 Ответ

0 голосов
/ 17 мая 2018

Ты не. Это не кастинг. Вы должны создать объект массива байтов Java с NewByteArray() и установить элементы, используя необработанные данные C, с помощью SetByteArrayRegion().

Вы заметите, что jbyteArray может быть приведен к uint8_t *, так как я передаю его в качестве параметра initializeProduct()

Non sequitur. То, что вы можете разыграть что-то, не означает, что это действительно так. Вам нужно использовать GetByteArrayElements() или GetByteArrayRegion(), чтобы получить данные из jbyteArray для вашего кода C, после чего следует соответствующий вызов ReleaseXXX() по завершении.

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