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



我对这个话题很新鲜。

我在我的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...但无论如何,我不明白如何使用GetByteArrayElements将我的byte[]放入我的 var 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);

根据 JNI 规范,字节数组不是基元类型,它们是对象。因此,您需要使用 CallStaticObjectMethod .

结果类型将是 jobject ,但您可以安全地将其转换为 jbyteArray(当然,如果它不是null(。有了jbyteArray,您可以拨打GetByteArrayElementsGetByteArrayRegion

最新更新