[Android篇]call to OpenGL ES API with no current context (logged once per thread)

文章撰寫日期︰2013/04/16 13:25
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天試圖使用JNI從Java(Android)層呼叫C++(Cocos2d-x)層,
讓Cocos2d-x換場景(replaceScene),
卻遇到Eclipse報
  1. Fatal signal 11 (SIGSEGV) at xxxxxxxx (code=1), thread xxxx (xxxxxx)
  2. call to OpenGL ES API with no current context (logged once per thread)
的錯誤。

二、解決辦法

這個問題是因為Android在啟動cocos2d-x的Thread時,
不是用context的主Thread,
而是另外產生OpenGL的Thread,
所以我們不能用主Thread去讓cocos2dx做OpenGL Thread原本應該做的工作(replaceScene),
要用OpenGL的Thread去完成︰

JAVA端-Cocos2dxActivity.java
//要用Cocos2dxActivty這個Activity去調用runOnGLThread!
Cocos2dxActivity.this.runOnGLThread(new Runnable(){

    @Override
    public void run() {
           replaceScene();
        }
    });

    public static native void replaceScene();
    static {
        System.loadLibrary("game");
   }

C++端
JNIEXPORT void JNICALL Java_com_hardworking_millioinschool_ios_Cocos2dxActivity_replaceScene(JNIEnv *env, jobject thiz)
{
    
    //切到主遊戲頁
    CCScene *pScene = TitleScene::scene();
    CCDirector::sharedDirector()->replaceScene(pScene);
    
}

相關文章

1. 雜物聚集地

2 則留言 :

  1. Cocos2dxActivity.this.runOnGLThread(new Runnable()) 用起來 Cocos2dxGLSurfaceView.getInstance().queueEvent() 舒服。

    回覆刪除