gpt4 book ai didi

android - SurfaceView 和 ANativeWindow

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:45:40 24 4
gpt4 key购买 nike

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



  1. mSurfaceView = new SurfaceView(this); 中这样做是否合适:

    • onCreate()
    • onStart()

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

  1. 继续,现在我想从上述表面(在 native 代码中)创建一个 native 窗口。

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)

    中是否合适
    • onSurfaceCreated_native(..., jobject surface)
    • onSurfaceChanged_native(..., jobject 表面)

提问原因:onSurfaceChanged 似乎总是在 onSurfaceCreated 之后调用,因此我们可以选择何时创建 native 窗口。一方面,在 onSurfaceCreated 中执行此操作似乎合乎逻辑,但两个 jobject surface 似乎引用了不同的对象! (通过在 onSurfaceCreated 中创建对表面的弱全局引用并在 onSurfaceChanged 中针对 NULL 和表面检查它来检查,请参见下面的代码)

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。

如果有人能为我阐明这个问题,我将不胜感激。

最佳答案

您是否尝试过使用 android.view.Surface 而不是 android.view.SurfaceView

关于android - SurfaceView 和 ANativeWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com