Как вызвать конкретный метод Java из NDK (JNI)? - PullRequest
0 голосов
/ 13 июня 2019

Я новичок в этой теме.

Я использую NDK в своем приложении для Android и у меня есть такой метод в Java

static byte[] getBytes(Bitmap bitmap)
{
    int size = bitmap.getRowBytes() * bitmap.getHeight();
    ByteBuffer byteBuffer = ByteBuffer.allocate(size);
    bitmap.copyPixelsToBuffer(byteBuffer);
    return byteBuffer.array();
}

Теперь мне нужно использовать этот метод из NDK

На самом деле я написал что-то вроде этого

jbyteArray arr = env->CallStaticByteMethod(jniIds.helper_class, jniIds.get_bytes, image_obj);

Но проблема в том, CallStaticByteMethod тип возврата jbyte, но мне нужно jbyteArray ...

Итак, вопрос, какнаписать этот метод?

РЕДАКТИРОВАТЬ

jobject arr_obj = env->CallStaticObjectMethod(jniIds.helper_class, jniIds.get_bytes, image_obj);
jbyteArray arr = static_cast<jbyteArray>(arr_obj);

//my needed result
unsigned char myArr = reinterpret_cast<unsigned char>(arr);

РЕДАКТИРОВАТЬ

jbyteArray arr_obj = (jbyteArray) env->CallStaticObjectMethod(jniIds.helper_class, jniIds.get_bytes, image_obj);

Теперь у меня есть jbyteArray ...но в любом случае я не понимаю, как с помощью GetByteArrayElements получить мой byte[] в мою переменную unsigned char *i_image?

РЕДАКТИРОВАТЬ

jbyteArray arr_obj = (jbyteArray)env->CallStaticObjectMethod(jniIds.helper_class, jniIds.get_bytes, image_obj);
jbyte *b = (jbyte *) env->GetByteArrayElements(arr_obj, NULL);
i_image = reinterpret_cast<unsigned char *>(b);
env->ReleaseByteArrayElements(arr_obj, b, JNI_ABORT);

1 Ответ

1 голос
/ 13 июня 2019

Согласно спецификации JNI , байтовые массивы не являются примитивными типами, они являются объектами.Таким образом, вам нужно использовать CallStaticObjectMethod.

. Тип результата будет jobject, но вы можете спокойно привести его к jbyteArray (если, конечно, это не null).С jbyteArray в руке вы можете позвонить GetByteArrayElements или GetByteArrayRegion.

...