2012-03-13 3 views
0

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 명령이 보내지거나 수신되지 않는 것과 관련이 있는지 궁금해하고 있습니다. 우리는 어떤 명령 처리도 아직 구현하지 않았으므로 이에 대해 조사하고 있습니다.

답변

1

전적으로 창을 올바르게 초기화 했습니까?

응용 프로그램 구조체의 ANativeWindow 포인터가 기본 진입 점으로 전달 될 때 자동으로 설정되지 않습니다. 나중에 Android 안드로이드 스레드에서 제공되며 app_glue가 설정 한 콜백 시스템을 통해 앱으로 전송됩니다.

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); 
    } 
    .... 
} 

당신은 아마 당신의 주요 렌더링 루프에서이 뜻을 이런 식으로 뭔가가 필요합니다

당신은 이런 식으로 그것을 수행 NDK에서 native_activity의 예에서 android_app에게 보낸 호출을 처리해야 기본 스레드에서 app_glue를 가져올 때 app_glue가 자동으로 창을 올바르게 설정할 수있게하십시오.

관련 문제