1、cocos2d-x c++界面层运行在一个GLThread线程里面,严格的说是运行在Cocos2dxGLSurfaceView(继承自GLSurfaceView)里面,Cocos2dxGLSurfaceView 类,它是cocos2d-x引擎的一部分。opengl的渲染和刷新都是由这个类来完成。 我们不能直接在主线程java方法里调用c++方法来刷新界面,唯一的方法就是绕开javaUI主线程,而这绕开主线程的工作让GLSurfaceView来完成。代码如下(在java代码里):
private static native void javaCallC();
private Cocos2dxGLSurfaceView mGLSurfaceView = null;
public TimerJavaToC(Cocos2dxActivity act)
{
mGLSurfaceView = Cocos2dxGLSurfaceView.getInstance();
init();
}
public void callCPP()
{
mGLSurfaceView.queueEvent( new Runnable()
{
@Override
public void run()
{
//调用jni,到c++
TimerJavaToC.javaCallC();
}
});
}
2、更新UI(更新数据)的两种方法是handler和runUiOnThread,更新UI必须得在主线程,否则会报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
3、游戏里从子线程到主线程也用runUiOnThread.