Android中使用本机窗口的分段错误 我们试图将C++应用程序移植到Android上。我们认为使用NativeActivity应该是最简单的,并且让所有OpenGL/EGL的东西都在本地完成

Android中使用本机窗口的分段错误 我们试图将C++应用程序移植到Android上。我们认为使用NativeActivity应该是最简单的,并且让所有OpenGL/EGL的东西都在本地完成,android,android-ndk,opengl-es-2.0,Android,Android Ndk,Opengl Es 2.0,现在,我们正在通过应用程序传递从android_native_app_glue.h中的android_app struct获取的ANativeWindow指针,以便在初始化窗口时使用它。下面是这段代码中的一些相关行(从调试代码中剥离): 这段代码继续创建一个上下文,makecurrent等等,但是我们没有做到这一点。我们在eglCreateWindowSurface上发现一个分段错误,并且由于显示和配置似乎已正确初始化,这只意味着ANativeWindow*有问题(tyepdef’d为EGLNa

现在,我们正在通过应用程序传递从android_native_app_glue.h中的android_app struct获取的ANativeWindow指针,以便在初始化窗口时使用它。下面是这段代码中的一些相关行(从调试代码中剥离):

这段代码继续创建一个上下文,makecurrent等等,但是我们没有做到这一点。我们在eglCreateWindowSurface上发现一个分段错误,并且由于显示和配置似乎已正确初始化,这只意味着ANativeWindow*有问题(tyepdef’d为EGLNativeWindowType)。错误消息:

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058
如果我们调用,也会出现分段错误,例如:

ANativeWindow_getHeight(wnd);
所以问题是,在这一点上,什么会导致分割错误?wnd不是空的,我们之前已经检查过了,所以应该以某种方式初始化它,并准备好使用它。调用此函数之前是否遗漏了某些内容,或者指针是否有问题


编辑:我们目前想知道这是否与APP_CMD_INIT_WINDOW命令未正确发送或接收有关(我们还没有实现任何命令处理,因此我们正在对此进行研究)。

您完全确定该窗口已正确初始化吗

当传递到本机入口点时,不会自动设置app struct中的ANativeWindow指针。它由安卓主线程稍后提供,然后通过app_glue设置的回调系统发送到app

您需要自己处理发送到android_应用程序的呼叫,在NDK中的本机_活动示例中,他们是这样做的:

int ident;
int events;
struct android_poll_source* source;

// If not animating, we will block forever waiting for events.
// If animating, we loop until all events are read, then continue
// to draw the next frame of animation.
while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
        (void**)&source)) >= 0) {

    // Process this event.
    if (source != NULL) {
        source->process(state, source);
    }
    ....
}

在主渲染循环中可能需要类似的东西,这将允许app_glue在从主线程获取窗口时自动正确设置窗口。

问题是
wnd
,通过主函数传递
state->window
void android_main(struct android_app*state)
将您的
bool OpenGLWindowES::Initialize(…)
方法作为第一个参数:

void android_main(struct android_app* state) {
    Initialize(state->window /*, other arguments here... */);
}

这是正确答案,在Android_Main中,窗口句柄仍然未知,
void android_main(struct android_app* state) {
    Initialize(state->window /*, other arguments here... */);
}