我在这个话题上很新鲜。
我在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[]
放入变量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);
答案 0 :(得分:1)
根据the JNI specification,字节数组不是原始类型,而是对象。
因此,您需要使用CallStaticObjectMethod
。
结果类型将为jobject
,但是您可以安全地将其强制转换为jbyteArray
(如果不是null
,则可以)。
手持jbyteArray
,您可以呼叫GetByteArrayElements
或GetByteArrayRegion
。