SurfaceView和ANativeWindow

问题描述 投票:6回答:1

我有关于SurfaceView的创作,随后从它得到一个ANativeWindow的问题。

  1. 它是正确的做 qazxsw POI在: qazxsw POI qazxsw POI

原因问:据我了解,当我们失去焦点(别的东西覆盖整个屏幕),所以我们需要将我们每次获得焦点时重新创建它(在onStart()被执行)的SurfaceView将被摧毁。抑或是SurfaceView保持休眠状态,可重复使用?

  1. 移动的,现在我想创建从上述表面的本地窗口(在本机代码)。它是正确的做 mSurfaceView = new SurfaceView(this);在: onCreate() onStart()

原因问:onSurfaceChanged似乎总是被调用后ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)所以我们有一个选择何时创建本机窗口。一方面,它似乎顺理成章的事情这onSurfaceCreated_native(..., jobject surface),但两个onSurfaceChanged_native(..., jobject surface)似乎被引用不同的对象! (正如通过创建一个弱全局REF在onSurfaceCreated表面和检查它针对两个NULL和表面在onSurfaceChanged检查,请参阅下面的代码)

onSurfaceCreated onSurfaceCreated jobject surface

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

myWeakObjectGlobal = env->NewWeakGlobalRef(surface);

}

因此,如果确有被送进onSurfaceCreated和onSurfaceChanged两个不同表面的对象,那么我们想用最新鲜的一个,而不是挂在一个陈旧的表面参考,啥都ANativeWindow_from_Surface在onSurfaceChanged。

我真的很感激,如果有人可以在这个问题上大放异彩一些轻我。

android java-native-interface surfaceview nativewindow
1个回答
0
投票

你是否尝试过使用,而不是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"); }

© www.soinside.com 2019 - 2024. All rights reserved.