У меня есть вопрос относительно создания SurfaceView и последующего получения из него ANativeWindow.
- Правильно ли делать
mSurfaceView = new SurfaceView(this);
in:
Причина, по которой я спрашиваю: насколько я понимаю, SurfaceView будет разрушен, когда мы проиграемfocus (что-то еще покрывает весь экран), поэтому нам нужно будет заново создавать его каждый раз, когда мы получаем фокус (onStart () выполняется).Или SurfaceView остается бездействующим и пригодным для повторного использования?
Продолжая, теперь я хотел бы создать собственное окно из вышеупомянутой поверхности (в собственном коде).Правильно ли делать
ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
в:
onSurfaceCreated_native(..., jobject surface)
onSurfaceChanged_native(..., jobject surface)
Причина запроса: onSurfaceChanged, кажется, всегда вызывается после onSurfaceCreated
, поэтому у нас есть выбор, когда создавать собственное окно.С одной стороны, кажется логичным сделать это в onSurfaceCreated
, но два jobject surface
, похоже, ссылаются на разные объекты!(Как проверено созданием слабой глобальной ссылки на поверхность в onSurfaceCreated и проверкой ее как на NULL, так и на поверхности в onSurfaceChanged, см. Код ниже)
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, тогда мы хотим использовать самую свежую и не зависать на устаревшей ссылке на поверхность, и, следовательно, сделать ANativeWindow_from_Surface в onSurfaceChanged.
Буду очень признателен, если кто-нибудь сможет пролить свет на этот вопрос для меня.