Can';开始渲染(android、SurfaceView、ndk、ANativeWindow)

Can';开始渲染(android、SurfaceView、ndk、ANativeWindow),android,android-ndk,Android,Android Ndk,我找了一整天,还是找不出我遗漏了什么。我发现的所有示例要么不完整(只是没有连接的片段),要么过于完整(如果原理正确,就看不出真正的部分) 我有一个活动,它有一个扩展SurfaceView的视图,应该使用本机方法填充该视图。它目前由一个memset(..,0,..)实现,但是我的视图是白色的,尽管所有调用看起来都很好 MyView: public class MyView extends SurfaceView implements SurfaceHolder.Callback { publi

我找了一整天,还是找不出我遗漏了什么。我发现的所有示例要么不完整(只是没有连接的片段),要么过于完整(如果原理正确,就看不出真正的部分)

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

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()(处理程序(mainLooper(),postDelayed())
  • 将ANativeWindow*保持为静态变量(在上述多次调用中)
  • 相同,无ANativeWindow_释放(pWindow)
  • 窗口格式\u RGBX\u 8888与窗口格式\u RGBA\u 8888
  • 填充图案
所以,在我看来,我填补了一个从未显示过的正确维度的缓冲区。可能我遗漏了一些明显的东西,因为似乎没有其他人有这样的问题

提前谢谢 莫里茨

谢谢

法登的评论就是答案。我的代码实际上称为setBackgroundColor(),这显然不是我想要的


(尽管我希望在这种情况下,该属性没有任何意义,或者是缓冲区将预先填充的内容…)

确保未在布局中为SurfaceView设置背景。如果视图或曲面为白色,则是因为有人将其设置为白色。SurfaceView有两个部分,即曲面和视图。曲面部分位于基于视图的UI后面的单独层上。SurfaceView的视图只需提供一个透明的“孔”为了便于使用布局代码。在视图上设置背景色或绘图时,会使视图不透明,并且曲面部分不再可见。