小编gad*_*get的帖子

SurfaceView和ANativeWindow

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

  1. 这样做是否合适

    mSurfaceView = new SurfaceView(this);:

    • onCreate()
    • onStart()

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

  1. 继续,现在我想从上面提到的表面(在本机代码中)创建一个本机窗口.这样做是否合适

    ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface):

    • onSurfaceCreated_native(..., jobject surface)
    • onSurfaceChanged_native(..., jobject surface)

询问的原因:onSurfaceChanged似乎总是被调用,onSurfaceCreated因此我们可以选择何时创建本机窗口.一方面,这样做似乎合乎逻辑onSurfaceCreated,但两者jobject surface似乎引用了不同的对象!(通过在onSurfaceCreated中创建一个弱的全局引用以及在onSurfaceChanged中对NULL和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 …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android surfaceview nativewindow

6
推荐指数
1
解决办法
6869
查看次数