SurfaceView和ANativeWindow

时间:2012-02-20 19:14:57

标签: android java-native-interface surfaceview nativewindow

我有一个关于创建SurfaceView并随后从中获取ANativeWindow的问题。

  1. 在[{1}}中执行是否合适:

    • mSurfaceView = new SurfaceView(this);
    • onCreate()
  2. 询问的原因:据我所知,SurfaceView会在我们失去焦点时被破坏(其他东西会覆盖整个屏幕)所以我们需要在每次获得焦点时重新创建它(执行onStart()) 。或者SurfaceView是否保持休眠状态并可重复使用?

    1. 继续,现在我想从上面提到的表面(在本机代码中)创建一个本机窗口。是否合适:onStart() in:

      • ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
      • onSurfaceCreated_native(..., jobject surface)
    2. 询问的原因:onSurfaceChanged似乎总是在onSurfaceChanged_native(..., jobject surface)之后调用,因此我们可以选择何时创建本机窗口。一方面,在onSurfaceCreated中执行此操作似乎合乎逻辑,但两个onSurfaceCreated似乎引用了不同的对象! (通过在onSurfaceCreated中创建一个弱的全局引用来检查并在onSurfaceChanged中对NULL和surface进行检查,请参阅下面的代码)

      jobject surface
      onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
      myWeakObjectGlobal = env->NewWeakGlobalRef(surface);

      }

      onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {

      if (env->IsSameObject(surface, myWeakObjectGlobal)) { LOGW("onSurfaceChanged_native: new surface is SAME as old surface"); } else { LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface"); } if (env->IsSameObject(NULL, myWeakObjectGlobal)) { LOGW(" furthermore, old surface is NULL"); } else { LOGW(" furthermore, old surface is NOT null"); }

      因此,如果确实有两个不同的表面对象被发送到onSurfaceCreated和onSurfaceChanged,那么我们想要使用最新的表面对象而不是挂在陈旧的表面引用上,因此在onSurfaceChanged中执行ANativeWindow_from_Surface。

      如果有人能为我解决这个问题,我真的很感激。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用android.view.Surface代替android.view.SurfaceView