美文网首页Android Framework
通过Surface获取ANativeWindow

通过Surface获取ANativeWindow

作者: YocnZhao | 来源:发表于2021-09-01 15:43 被阅读0次

    每一种操作系统都定义了自己的窗口系统,而 ANativeWindow 就是 Android 的本地窗口,在 Android Java 层,Surface 又继承于 ANativeWindow ,实际上 Surface 是 ANativeWindow 的具体实现,所以一个 ANativeWindow 表示的就是一块屏幕缓冲区。

    我们要渲染一帧图像,只需要将图像数据刷进 ANativeWindow 所表示的屏幕缓冲区即可。
    ANativeWindow的使用步骤大致如下:

    1. 通过ANativeWindow_fromSurface获取与Surface对应的ANativeWindow对象
    2. ANativeWindow_setBuffersGeometry设置buffer的尺寸和格式
    3. ANativeWindow_acquire获取引用对象
    4. 利用ANativeWindow_lock/ANativeWindow_unlockAndPost与之间的绘制代码绘制图像
    5. ANativeWindow_release释放引用.

    ANativeWindow和java的Surface是什么关系呢?为什么可以通过ANativeWindow_fromSurface(env, surface);得到ANativeWindow

    源码中查找发现native_window.cpp中调用了`android_view_Surface_getNativeWindow(env, surface);

    // /frameworks/base/core/jni/android_view_Surface.cpp
        sp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) {
            sp<Surface> sur;
            jobject lock = env->GetObjectField(surfaceObj,
                                               gSurfaceClassInfo.mLock);
            if (env->MonitorEnter(lock) == JNI_OK) {
                sur = reinterpret_cast<Surface *>(
                        env->GetLongField(surfaceObj, gSurfaceClassInfo.mNativeObject));
                env->MonitorExit(lock);
            }
            env->DeleteLocalRef(lock);
            return sur;
        }
    

    可知就是通过获取android.view.Surface这个class中的mNativeObject属性获得到。查看Surface.java中mNativeObject的赋值操作只有在:

        private void setNativeObjectLocked(long ptr) {
            ...
                mNativeObject = ptr;
           ...
        }
    

    而调用这个方法的都在构造方法或者状态恢复方法中。所以我们明白mNativeObject存储的其实就是一块内存地址,而通过这个内存地址可以直接强转获取到ANativeWindow的地址指针。

    关于java使用long存储地址可以查看JNI中用long传递指针到java

    相关文章

      网友评论

        本文标题:通过Surface获取ANativeWindow

        本文链接:https://www.haomeiwen.com/subject/irgxwltx.html