我有一个关于创建SurfaceView并随后从中获取ANativeWindow的问题。
mSurfaceView = new SurfaceView(this);
onCreate()
询问的原因:据我所知,SurfaceView会在我们失去焦点时被破坏(其他东西会覆盖整个屏幕)所以我们需要在每次获得焦点时重新创建它(执行onStart()) 。或者SurfaceView是否保持休眠状态并可重复使用?
继续,现在我想从上面提到的表面(在本机代码中)创建一个本机窗口。是否合适:onStart()
in:
ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
onSurfaceCreated_native(..., jobject surface)
询问的原因: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。
如果有人能为我解决这个问题,我真的很感激。
答案 0 :(得分:0)
您是否尝试过使用android.view.Surface
代替android.view.SurfaceView
?