Google은 Android에 C++ 애플리케이션을 이식하려고합니다. NativeActivity를 사용하는 것이 가장 쉽고 모든 OpenGL/EGL을 기본적으로 수행 할 수 있다고 생각합니다.Android에서 기본 창을 사용하여 분할 오류가 발생했습니다.
지금 우리는 android_native_app_glue.h의 android_app 구조체에서 얻은 ANativeWindow 포인터를 응용 프로그램을 통해 전달하여 창을 초기화 할 때 사용할 수 있도록합니다. 여기에 (디버그 코드에서 제거)이 코드에서 몇 관련 라인이다 : makecurrent 등, 컨텍스트를 만드는
bool OpenGLWindowES::Initialize(EGLNativeWindowType wnd, EGLNativeDisplayType dsp,
EGLint redSize, EGLint greenSize, EGLint blueSize, EGLint alphaSize, EGLint depthSize, bool bMultiSample)
{
m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if(m_display == EGL_NO_DISPLAY)
{
return false;
}
EGLint iMajorVersion, iMinorVersion;
if (!eglInitialize(m_display, &iMajorVersion, &iMinorVersion))
{
return false;
}
eglBindAPI(EGL_OPENGL_ES_API);
bool ecc = eglChooseConfig(m_display, attribs, &m_config, 1, &iConfigs);
if (!ecc || (iConfigs != 1))
{
return false;
}
EGLint format;
eglGetConfigAttrib(m_display, m_config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(wnd, 0, 0, format);
m_windowSurface = eglCreateWindowSurface(m_display, m_config, wnd, NULL);
//etc
}
이 코드 진행, 그러나 우리는 멀리하지 않습니다. eglCreateWindowSurface에 세분화 오류가 발생하고 디스플레이 및 구성이 올바르게 초기화 된 것처럼 보이기 때문에 ANativeWindow * (tyepdef가 EGLNativeWindowType에 대한 문제) 만 의미 할 수 있습니다. 오류 메시지 :
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058
예를 들어 우리가 호출하는 경우 우리는 또한 세그먼트 오류를 얻을 :
ANativeWindow_getHeight(wnd);
그래서 질문은, 무엇을이 시점에서 세그먼트 오류가 발생할 수 있습니까? wnd가 null이 아니기 때문에 이전에 이것을 검사 했으므로 어떻게 든 초기화되어야하며 사용할 준비가되어 있어야합니다. 이 함수를 호출하기 전에 뭔가를 놓쳤습니까? 아니면 포인터에 문제가있을 수 있습니까?
편집 : 우리는 현재 APP_CMD_INIT_WINDOW 명령이 보내지거나 수신되지 않는 것과 관련이 있는지 궁금해하고 있습니다. 우리는 어떤 명령 처리도 아직 구현하지 않았으므로 이에 대해 조사하고 있습니다.