我对这个话题很新鲜。
我在我的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
,您可以拨打GetByteArrayElements
或GetByteArrayRegion
。