【问题标题】:Display rgb888 data on android device screen from the native code从本机代码在 android 设备屏幕上显示 rgb888 数据
【发布时间】:2013-01-28 15:09:51
【问题描述】:

这是一个我认为只有彻底研究过android-ndk的人才能回答的问题。

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

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

所以我恳请你们提供建议和任何技术来做同样的事情。 提前致谢...等待回复...

【问题讨论】:

    标签: android opencv image-processing android-ndk


    【解决方案1】:

    听起来您正在用 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 端,在其他地方使用位图。

    【讨论】:

    • 感谢您的回复...是的,这可能会有所帮助,但我无法理解使用上述技术的位图等离子示例。您能否提供一个示例或代码 sn-p 来说明上述内容?如果你这样做,我一定会接受你的回答。但请不要提供位图等离子示例程序的链接。
    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2016-02-09
    相关资源
    最近更新 更多