中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2d-x3.0beta版+NDK-r9b在android上的啟動過程

發布時間:2020-07-29 18:56:21 來源:網絡 閱讀:980 作者:AndyLiuchangTao 欄目:游戲開發

   首先來先下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();這個函數來實現時間的分發。相關內同詳細查看事件監聽的相關回調調函數。


僅此記錄今天的學習成功,好記性不如爛筆頭,所以還是記錄下來,以便日后查看!



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐河县| 江西省| 温宿县| 武汉市| 丹东市| 利津县| 白沙| 定陶县| 若羌县| 金湖县| 普兰县| 宜都市| 从江县| 西青区| 宿迁市| 鄢陵县| 绩溪县| 平遥县| 奈曼旗| 介休市| 尼勒克县| 凤山市| 华亭县| 达日县| 雅江县| 鲁山县| 盐山县| 石泉县| 沈丘县| 兴城市| 塔城市| 郯城县| 思南县| 荣成市| 绥江县| 诸城市| 阿克陶县| 广昌县| 张掖市| 阿勒泰市| 文成县|