1

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

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

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

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

4

1 回答 1

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 端,在其他地方使用位图。
于 2013-02-23T04:54:35.677 回答