我有一个应用程序,用户可以在上面拍照,照片以 Bitmap 位图
的形式返回到 java 方法。我想将此位图传递给 C++ 函数以在获取后立即进行一些 OpenCV 处理。
我无法找到正确的数据格式来将位图传递到方法中。我试过将位图作为 jobect 参数传递,但没有成功。
这是我要将位图传递到的 jni 方法:
JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_MainActivity_generateAssets(
JNIEnv *env, jobject thiz, jobject assetManager) {
最佳答案
要从 jni 访问 Bitmap
的像素缓冲区,您可以调用 getPixels :
NewByteArray
一个byte[]
对象(只需要做一次和 GlobalRef/重复使用)- FindClass/GetMethodID/CallVoidMethod 从 c/c++ 调用 getPixels
GetByteArrayRegion
将 javabyte[]
映射到 c 缓冲区。
您可以检查 JNI 函数 here
否则,在 Java 端管理 byte[]
像素缓冲区,并将 byte[]
(和图像格式/尺寸)传递给 jni 而不是 位图
对象。例如:
JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_jniFacility_handleFrame(
JNIEnv *env, jobject self, jobject pixels, jint width, jint height, jint format) {
...
}
既然你说你得到了Bitmap
,将位图传递给jni:
pixels = new byte[width * height * 4]; // assume RGBA, do once only
...
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
handleFrame(pixels, bitmap.getWidth(), bitmap.getHeight());
为了获得最佳性能(和实时录制),您可能需要使用 ImageReader
并改为使用 YUV 图像。
顺便说一下,如果您通过 ImageReader 获取帧,opencv 接受 ImageFormat.YUV_420_888
。您可能想要调整大小并只使用亮度 channel 进行大多数处理。
关于java - 使用 jni 将位图从 android 相机传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48122837/