文章撰寫日期︰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報
- Fatal signal 11 (SIGSEGV) at xxxxxxxx (code=1), thread xxxx (xxxxxx)
- 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); }
Cocos2dxActivity.this.runOnGLThread(new Runnable()) 用起來 Cocos2dxGLSurfaceView.getInstance().queueEvent() 舒服。
回覆刪除謝謝您的建議!
刪除