java - 使用 jni 将位图从 android 相机传递到 C++

标签 java android c++ opencv bitmap

我有一个应用程序,用户可以在上面拍照,照片以 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 将 java byte[] 映射到 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/

相关文章:

java - 如何获得在小米(MIUI)设备中删除联系人的权限?

C++ 现代字符串指针

c++ - 在类头和实现中包含头?

java - 我需要在我的 View 中调用 MediaPlayer

java - 使用 Jsoup.connect() 时会发生什么?为什么这么慢?

java - 在 Android 中将 String 解析为 Double 的更好方法

c++ - QDebug() << 东西;自动添加换行符?

java - wurfl 1.4 的 Maven

java - Spring Batch 中多个输入文件的分区器多线程

java - 在 WebView 中显示 .swf 文件