您好,登錄后才能下訂單哦!
首先來先下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暴露在外面的部分函數(shù)源碼和接口,3.0就是使用這里面的機制來實現(xiàn)從androidactivity轉(zhuǎn)入cocos2d的引擎。
android啟動不向java有給main入口,android程序的入口是在xxxManifest.xml文件里面制定程序的入口,文件內(nèi)容如下:
<?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的入口類,里面有個函數(shù)protected void onCreate(Bundle savedInstanceState),android每次啟動都會去調(diào)這個函數(shù)產(chǎn)生一個android Ativity,需要注意的是onCreate這個函數(shù)有可能多次被調(diào)用,關(guān)于這個問題下次有時間在慢慢聊
2,有了Activity之后,系統(tǒng)會去找到meta-data數(shù)據(jù)項,去加載對應(yīng)的內(nèi)容,根據(jù)
<meta-data android:name=
"android.app.lib_name"
android:value=
"cocos2dcpp"
/>
根據(jù)這個可以知道需要加載的庫名,然后根據(jù)
<meta-data android:name=
"android.app.func_name"
android:value=
"ANativeActivity_onCreate"
/>
這個項確定要調(diào)用庫的哪個函數(shù)來進(jìn)入庫的執(zhí)行,這一項是可選配置,在不指定的情況下默認(rèn)就是調(diào)用android-ndk-r9b\sources\android\native_app_glue\android_native_app_glue.cpp文件倆面的
void ANativeActivity_onCreate(ANativeActivity* activity,void* savedState, size_t savedStateSize)函數(shù),
在這里初始化activity的對調(diào)函數(shù)和一些數(shù)據(jù)。
3,之后調(diào)用
static struct android_app* android_app_create(ANativeActivity* activity,
void* savedState, size_t savedStateSize)
這個函數(shù)來生成android_app,并保存在activity的instance中,供回調(diào)使用。在這個函數(shù)中打開一個通訊管道,提供cocos2d線程和activity主線程之間的通信。并使用void* android_app_entry(void* param)這個縣城函數(shù)入口創(chuàng)建cocos2d的線程。這個函數(shù)等到
cocos2d主線程城建成功才會返回,所以我們可以確定的是,當(dāng)這個函數(shù)返回了,整個android已經(jīng)進(jìn)入到上層。
以上3步都是在ndk中實現(xiàn),在線程函數(shù)里面調(diào)用了一個外部函數(shù) android_main,我們的cocos2d引擎就是從這里開始的實現(xiàn)的。好了,西面是進(jìn)入引擎層了。
4,cocos2d通過實現(xiàn)了這個借口函數(shù)來實現(xiàn)全局的事件監(jiān)聽主循環(huán),當(dāng)監(jiān)聽到APP_CMD_INIT_WINDOW這個事件并且窗口沒有創(chuàng)建是就去創(chuàng)建窗口并調(diào)cocos_init函數(shù)來初始化opendGL
5,調(diào)用cocos_android_app_init這個函數(shù)來創(chuàng)建并初始化cocos2d的相關(guān)內(nèi)容,然后調(diào)用cocos2d::Application::getInstance()->run();這個函數(shù)來實現(xiàn)時間的分發(fā)。相關(guān)內(nèi)同詳細(xì)查看事件監(jiān)聽的相關(guān)回調(diào)調(diào)函數(shù)。
僅此記錄今天的學(xué)習(xí)成功,好記性不如爛筆頭,所以還是記錄下來,以便日后查看!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。