如何从NDK(JNI)调用特定的Java方法?

时间:2019-06-13 11:03:17

标签: java android c++ android-ndk java-native-interface

我在这个话题上很新鲜。

我在Android应用中使用NDK,而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 ...但无论如何我不理解如何使用GetByteArrayElementsbyte[]放入变量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 个答案:

答案 0 :(得分:1)

根据the JNI specification,字节数组不是原始类型,而是对象。 因此,您需要使用CallStaticObjectMethod

结果类型将为jobject,但是您可以安全地将其强制转换为jbyteArray(如果不是null,则可以)。 手持jbyteArray,您可以呼叫GetByteArrayElementsGetByteArrayRegion