首先来先下ndk-r9b提供的借口和源码文件:

android-ndk-r9b\sources\android\native_app_glue\android_native_app_glue.h

android-ndk-r9b\sources\android\native_app_glue\android_native_app_glue.cpp


在这里面是ndk暴露在外面的部分函数源码和接口,3.0就是使用这里面的机制来实现从androidactivity转入cocos2d的引擎。

android启动不向java有给main入口,android程序的入口是在xxxManifest.xml文件里面制定程序的入口,文件内容如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.myTest"      android:versionCode="1"      android:versionName="1.0.0">    <uses-sdk android:minSdkVersion="9"/>    <uses-feature android:glEsVersion="0x00020000" />    <application android:label="@string/app_name"                 android:icon="@drawable/icon">        <activity android:name="org.cocos2dx.cpp.Cocos2dxActivity"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      android:label="@string/app_name"                  android:screenOrientation="landscape"                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"                  android:configChanges="orientation|screenSize|smallestScreenSize">            <!-- Tell NativeActivity the name of our .so -->            <meta-data android:name="android.app.lib_name"                       android:value="cocos2dcpp" />            <meta-data android:name="android.app.func_name"                       android:value="ANativeActivity_onCreate" />            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                </application>    <supports-screens android:anyDensity="true"                      android:smallScreens="true"                      android:normalScreens="true"                      android:largeScreens="true"                      android:xlargeScreens="true"/>    <uses-permission android:name="android.permission.INTERNET"/></manifest>



android启动流程:

1,activity android:name="org.cocos2dx.cpp.Cocos2dxActivity" 这一行指定了android的nativeActivity的入口类,里面有个函数protected void onCreate(Bundle savedInstanceState),android每次启动都会去调这个函数产生一个android Ativity,需要注意的是onCreate这个函数有可能多次被调用,关于这个问题下次有时间在慢慢聊

2,有了Activity之后,系统会去找到meta-data数据项,去加载对应的内容,根据

<meta-data android:name= "android.app.lib_name" android:value= "cocos2dcpp" />

根据这个可以知道需要加载的库名,然后根据

<meta-data android:name="android.app.func_name" android:value="ANativeActivity_onCreate"/>

这个项确定要调用库的哪个函数来进入库的执行,这一项是可选配置,在不指定的情况下默认就是调用android-ndk-r9b\sources\android\native_app_glue\android_native_app_glue.cpp文件俩面的

void ANativeActivity_onCreate(ANativeActivity* activity,void* savedState, size_t savedStateSize)函数,

在这里初始化activity的对调函数和一些数据。

3,之后调用

static struct android_app* android_app_create(ANativeActivity* activity,

void* savedState, size_t savedStateSize)

这个函数来生成android_app,并保存在activity的instance中,供回调使用。在这个函数中打开一个通讯管道,提供cocos2d线程和activity主线程之间的通信。并使用void* android_app_entry(void* param)这个县城函数入口创建cocos2d的线程。这个函数等到

cocos2d主线程城建成功才会返回,所以我们可以确定的是,当这个函数返回了,整个android已经进入到上层。

以上3步都是在ndk中实现,在线程函数里面调用了一个外部函数 android_main,我们的cocos2d引擎就是从这里开始的实现的。好了,西面是进入引擎层了。


4,cocos2d通过实现了这个借口函数来实现全局的事件监听主循环,当监听到APP_CMD_INIT_WINDOW这个事件并且窗口没有创建是就去创建窗口并调cocos_init函数来初始化opendGL

5,调用cocos_android_app_init这个函数来创建并初始化cocos2d的相关内容,然后调用cocos2d::Application::getInstance()->run();这个函数来实现时间的分发。相关内同详细查看事件监听的相关回调调函数。


仅此记录今天的学习成功,好记性不如烂笔头,所以还是记录下来,以便日后查看!



更多相关文章

  1. Android(安卓)NFC架构分析
  2. 理解onMeasure
  3. Android中Message机制的灵活应用
  4. ReactNative 调用Android(安卓)原生(二)——原生组件
  5. Android】获取Mac地址
  6. android相机预览
  7. android中的recovery模式
  8. Windows 下 Android(安卓)NDK 环境配置
  9. android webService

随机推荐

  1. Android系统信息获取 之十三:Linux内核版
  2. android平台下基于MediaRecorder和AudioR
  3. android Activity实现从底部弹出或滑出选
  4. Mono For Android离线激活
  5. Android(安卓)开发者的下半场
  6. Android中级进阶FAQ
  7. Android通过加载其他应用的Dex文件破解关
  8. 如何在Android(安卓)Studio中添加Recycle
  9. Android之ListActivity:布局与数据绑定
  10. 详解Android中的SQLite数据库存储