1.oncreate
@Override
protected
onCreate(finalBundlesavedInstanceState){
super.onCreate(savedInstanceState);
onLoadNativeLibraries();
sContext=
this
;
.mHandler=
Cocos2dxHandler(
);
Cocos2dxHelper.init(
);
.mGLContextAttrs=getGLContextAttrs();
.init();
if
(mVideoHelper==null){
mVideoHelper=
Cocos2dxVideoHelper(
,mFrameLayout);
}
(mWebViewHelper==null){
mWebViewHelper=
Cocos2dxWebViewHelper(mFrameLayout);
}
}
2.init
init(){
ViewGroup.LayoutParamsframelayout_params=
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mFrameLayout=
FrameLayout(
);
mFrameLayout.setLayoutParams(framelayout_params);
//Cocos2dxEditTextlayout
ViewGroup.LayoutParamsedittext_layout_params=
ViewGroup.LayoutParams.WRAP_CONTENT);
Cocos2dxEditTextedittext=
Cocos2dxEditText(
);
edittext.setLayoutParams(edittext_layout_params);
//...addtoFrameLayout
mFrameLayout.addView(edittext);
//Cocos2dxGLSurfaceView
.mGLSurfaceView=
.onCreateView();
//...addtoFrameLayout
mFrameLayout.addView(
.mGLSurfaceView);
//SwitchtosupportedOpenGL(ARGB888)modeonemulator
(isAndroidEmulator())
.mGLSurfaceView.setEGLConfigChooser(8,8,16,0);
.mGLSurfaceView.setCocos2dxRenderer(
Cocos2dxRenderer());
.mGLSurfaceView.setCocos2dxEditText(edittext);
//Setframelayoutasthecontentview
setContentView(mFrameLayout);
B. Cocos2dxGLSurfaceView.java
5
//这个类的代码就不贴了,不过看了之后应该一些疑惑就得到了解答
|
C. Cocos2dxRenderer.java
45
//这个类关注几个callback就好
1.onSurfaceCreated
这里调用了一个本地方法nativeInit,负责给导演设置了glview并调用了application的run方法
联想到linux的实现,看样子android的大循环也开启了,但令人感到奇怪的是,android的application
的run方法只调用了applicationDidFinishLaunching而没哟类似linux的大循环。。。问题4
吼吼,继续走起
2.onSurfaceChanged
3.onDrawFrame
@Override
onDrawFrame(finalGL10gl){
/*
*Noneedtousealgorithmindefault(60FPS)situation,
*sinceonDrawFrame()wascalledbysystem60timespersecondbydefault.
*/
(sAnimationInterval<=1.0/60*Cocos2dxRenderer.NANOSECONDSPERSECOND){
Cocos2dxRenderer.nativeRender();
}
else
{
final
@H_ 404_1156@long
now=System.nanoTime();
interval=now-
.mLastTickInNanoSeconds;
(interval<Cocos2dxRenderer.sAnimationInterval){
try
{
Thread.sleep((Cocos2dxRenderer.sAnimationInterval-interval)/Cocos2dxRenderer.NANOSECONDSPERMICROSECOND);
catch
(finalExceptione){
}
}
/*
*RendertimeMUSTbecountedin,ortheFPSwillslowerthanappointed.
*/
.mLastTickInNanoSeconds=System.nanoTime();
Cocos2dxRenderer.nativeRender();
}
}
4.Cocos2dxRenderer.nativeRender
JNIEXPORT
JNICALLJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeRender(JNIEnv*env){
cocos2d::Director::getInstance()->mainLoop();
}
|
D. javaactivity-android.cpp
小结
-
在proj.androd工程里面,几个注意的细节:manifest里面定义了so库的名称并在cocos提供的Cocos2dxActivity onCreate里得到加载;jni里面的main.cpp里面有个奇怪的方法并在那里new了一个application对象,而这个方法同样是被Cocos2dxActivity onCreate方法间接调用到的。
-
在目录cocos/platform/android/下,有用信息很丰富,包含了:
-
很多跨平台实现细节里面的关于android平台的特地实现,如application,fileUtil,glView等
-
对接android平台的事件源,在java层设置事件监听,监听器被回调,jni调用到native层,native层通过事件分发器发送事件。这个过程基本都和glSurfaceView关联了。这里的事件包括加速器事件,touch事件,key事件。
-
对比linux平台的那个大循环,android的大循环本质思路还是一样的。只是那个大循环被Cocos2dxRenderer.java onDrawFrame代替。关于glSurfaceView GLSurfaceView.Renderer的更多信息请参考扩展阅读里面的链接。
-
提供了android平台上关于音频播放相关的两个封装。而且是供native方法调用的。具体用法暂没细看。
-
提供了android平台上播放视频和打开网页相关的分装,通过动态往Cocos2dxActivity的contentView里面添加删除videoView或者webView来实现。具体用法暂没细看。
-
提供了本地数据库存储的包装实现。
-
提供了很多helper类或者功能,弹出对话框,弹出输入法框,获取应用包名等。
-
提一提android程序是怎么退出的:menuCloseCallback --> Director::getInstance()->end() --> (android平台的实现)GLViewImpl::end() --> (Java_org_cocos2dx_lib_Cocos2dxHelper.cpp)terminateProcessJNI --> (Cocos2dxHelper.java) terminateProcess --> android.os.Process.killProcess(android.os.Process.myPid());
-
那android程序怎么起来的呢。。。Zygote and fork,that's a long story
扩展阅读
http://developer.android.com/reference/android/opengl/GLSurfaceView.html
http://developer.android.com/reference/android/opengl/GLSurfaceView.Renderer.html
OpenGL例子:https://github.com/cheyiliu/test4opengles
http://developer.android.com/training/articles/perf-jni.html
|