可以'渲染工作(android,SurfaceView,ndk,ANativeWindow)

时间:2015-05-12 13:55:39

标签: android android-ndk

我搜索了一整天,仍然无法弄清楚,我错过了什么。我发现的所有例子都是不完整的(只是没有连接的片段)或者是过于完整的(如果原则,看不出真正的部分)

我有一个Activity,它有一个View,它扩展了应该使用本机方法填充的SurfaceView。它目前由memset(..,0,..)实现,但我的View是白色的,尽管所有调用看起来都很好。

MyView的:

public class MyView extends SurfaceView implements SurfaceHolder.Callback
{
  public MyView(Context context)
  {
    super(context);
    SurfaceHolder sh = getHolder();
    sh.addCallback(this);
  }

  // protected void onDraw(Canvas canvas) // works to make the view red
  //   { canvas.drawColor(Color.RED);} 

  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
  {
    nativeRender(holder.getSurface(), width, height);
  }

  public void surfaceCreated(SurfaceHolder holder)
  {}

  public void surfaceDestroyed(SurfaceHolder holder)
  {}

  private native void nativeRender(Object surface, int width, int height);
}

原生方法:

void ...nativeRender(JNIEnv* env, jobject myView, jobject surface, jint width, jint height)
{
   ANativeWindow* pWindow(ANativeWindow_fromSurface(env, surface));
   ANativeWindow_setBuffersGeometry(pWindow, width,height,WINDOW_FORMAT_RGBX_8888);

   ANativeWindow_Buffer buffer;

   if (ANativeWindow_lock(pWindow, &buffer, NULL) == 0) 
   {
       memset(buffer.bits, 0, buffer.stride*buffer.height*4);
       ANativeWindow_unlockAndPost(pWindow);
   }
   ANativeWindow_release(pWindow);
}

我检查过的事情:

  • 所有ANativeWindow_ *的返回值均为0.
  • 缓冲区大小/格式符合预期

我尝试的事情:

  • 从onDraw()
  • 调用nativeRender()
  • 重复调用nativeRender()(Handler(mainLooper(),postDelayed())
  • 将ANativeWindow *保持为静态变量(通过上述多次调用)
  • 同样没有ANativeWindow_release(pWindow);
  • WINDOW_FORMAT_RGBX_8888 vs WINDOW_FORMAT_RGBA_8888
  • 填充模式

所以在我看来,我填充了一个从未显示的正确尺寸的缓冲区。可能我错过了一些明显的东西,因为没有其他人似乎有这样的问题。

先谢谢 Moritz的

1 个答案:

答案 0 :(得分:2)

谢谢!

费登的评论就是答案。我的代码实际上叫做setBackgroundColor(),这显然不是我想要的......

(虽然我希望在这种情况下,这个属性没有任何意义,或者是缓冲区预先填充的内容......)