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