从本机代码在Android设备屏幕上显示rgb888数据

时间:2013-02-13 05:57:19

标签: android opencv image-processing android-ndk

这是一个问题,我认为只有在android-ndk中彻底工作的人才能回答。

问题:我编写了一个使用文件浏览器读取输入文件的应用程序。然后,当按下按钮Decode and Play 时,应用程序应解码编码的输入文件并将其显示在设备屏幕上。这里的问题是解码是在本机代码中执行的。解码是正确的,因为我把它丢弃在SD卡上并使用原始视频播放器验证它。解码后的帧采用RGB888格式,数据类型为 unsigned char 。因此,如果有人知道如何显示本机代码中的数据,请提供相关的一些建议。

我试过:首先我将帧缓冲区返回到调用本机代码的函数,然后我将帧缓冲区转换为char数组并将此数组作为java对象返回(即jcharArray )我的活动。在我的活动中,我将char数组转换为int数组,并使用setpixels()函数将此数组分配给位图。然后使用画布我将此框架绘制到设备屏幕。应用程序如何崩溃,主要的是每次解码帧时控件似乎都没有回到java活动。此外,即使这种技术有效,显示的帧也会非常慢,以至于它看起来永远不像视频。

所以我请求人们提供建议和任何技术来做同样的事情。 在此先感谢...等待回复...

1 个答案:

答案 0 :(得分:0)

听起来您正在使用Java完成大部分工作,并且只想将位图数据从JNI传递到Java。 (替代方案包括使用OpenGL ES从JNI端进行绘图。)如果是这种情况,请查看<android/bitmap.h>标题,这将要求您链接到jnigraphics库(-ljnigraphics)。

基本上,您可以执行以下操作:

  1. 在Java端创建适当的帧大小和数据类型的android.graphics.Bitmap,并将其传递给您的JNI代码
  2. 在接收JNI代码中,调用AndroidBitmap_lockPixels(),使用memcpy()或等效项将数据复制到结果指针中,使用AndroidBitmap_unlockPixels()解锁位图,然后返回Java。
  3. 回到Java端,在任何地方使用位图。