標籤:android style blog http io color ar os 使用
上篇文章試著分析了 cocos2d-x 3.2 在 win32平台下的啟動過程。今天我們繼續探尋,看看 Android 平台下,引擎又是如何啟動的。
預備知識:
1. 對 jni ( java 調用 c++ 動態庫) 技術略微瞭解
2. 大致瞭解 Android 應用的開發過程。 (不用太多)
一、入口
有過 Android 開發經驗的朋友應該都清楚,普通的 Android 應用,其入口都是 Application 或它的子類類型,再看需要介面與否選擇實現 Activity 或者 Service 類。cocos2d-x 雖然主要用 C++ 開發,在這一點上卻也沒什麼特別。不同的是,在 cocos2d-x 中,這幾個類真的只是起入口的作用,引擎的渲染過程以及所有的內部邏輯,都是用 c++實現的。我們自己寫的c++代碼,和引擎代碼一起被編譯成動態庫,再由 java 層通過 jni 技術進行調用,從而進入到引擎的核心部分。這樣說概念比較模糊,接下來我們具體的進行分析。
二、工程目錄
顯然,這次我們關注的應該是工程中與 Android 相關的部分:
進入 proj.android 目錄,裡面是一些 eclipse 項目的設定檔以及一些目錄,其中:
src 目錄存放的是 java 源檔案。
jni 目錄存放的是 c++源檔案以及 NDK 的編譯指令碼 (makefile)。
src 目錄
jni 目錄
開啟 hellocpp/main.cpp,裡面只有一個函數:
1: void cocos_android_app_init (JNIEnv* env, jobject thiz)
2: {
3: LOGD("cocos_android_app_init");
4: AppDelegate *pAppDelegate = new AppDelegate();
5: }
是不是有點奇怪,明明叫做 main.cpp, 裡面卻沒有 main 函數,這也就算了,函數裡居然只是定義了一個 AppDelegate類型的對象,卻沒有使用它。別急,我們暫且接受這個現實,將目光轉向另一個方面。
轉到 src 目錄,只有一個 org 檔案夾,一路開啟,最後找到 AppActivity.java 這個檔案,這也是該目錄下唯一的源檔案。開啟它:
1: package org.cocos2dx.cpp;
2:
3: import org.cocos2dx.lib.Cocos2dxActivity;
4:
5: public class AppActivity extends Cocos2dxActivity {
6: }
這裡面也沒什麼內容,只不過定義了一個 AppAcvivity 類作為遊戲的介面入口(可參照 AndroidManifest.xml ),看來真正的玄機就在它繼承的 Cocos2dxActivity 類上了。
那麼這個類在哪裡呢?讓我們離開 proj.android 目錄,進入同級的 cocos2d 目錄,這裡就是引擎的核心代碼存放之處。進入 cocos/cocos/platform,裡面放的是引擎中各個平台代碼的實現。
../cocos2d/cocos/platform/
進入 android/java/src/org/cocos2dx/lib:
都在這裡了!看看 Cocos2dxActivity.java 裡面都有什麼,首先關注 onCreate():
1: @Override
2: protected void onCreate(final Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4:
5: onLoadNativeLibraries(); //載入 c++ 編譯而成的動態庫,這裡是libcocos2dcpp.so
6:
7: sContext = this;
8: this.mHandler = new Cocos2dxHandler(this); //Cocos2dxHandler 繼承自 Handler,處理一些顯示對話方塊類似的請求。
9:
10: Cocos2dxHelper.init(this); //Cocos2dxHelper 工具類,處理一些 Activity 生命週期事件以及發起一些請求
11:
12: this.init(); //初始化自身
13: if (mVideoHelper == null) {
14: mVideoHelper = new Cocos2dxVideoHelper(this, mFrameLayout); //顧名思義
15: }
16: }
可以看到,onCreate()初始化了一系列輔助類,詳見注釋,我們再看init()函數:
1: public void init() {
2:
3: // 設定Activity的布局為FrameLayout
4: // FrameLayout
5: ViewGroup.LayoutParams framelayout_params =
6: new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
7: ViewGroup.LayoutParams.MATCH_PARENT);
8: mFrameLayout = new FrameLayout(this);
9: mFrameLayout.setLayoutParams(framelayout_params);
10:
11: //這裡有點奇怪,此處的Cocos2dxEditText我還不清楚其作用,期待高人解答~
12: // Cocos2dxEditText layout
13: ViewGroup.LayoutParams edittext_layout_params =
14: new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
15: ViewGroup.LayoutParams.WRAP_CONTENT);
16: Cocos2dxEditText edittext = new Cocos2dxEditText(this);
17: edittext.setLayoutParams(edittext_layout_params);
18:
19: // ...add to FrameLayout
20: mFrameLayout.addView(edittext);
21:
22: //建立一個Cocos2dxGLSurfaceView
23: // Cocos2dxGLSurfaceView
24: this.mGLSurfaceView = this.onCreateView();
25:
26: //將Cocos2dxGLSurfaceView加入布局中
27: // ...add to FrameLayout
28: mFrameLayout.addView(this.mGLSurfaceView);
29:
30: //如果是Android模擬器,設定OpenglES的一些參數
31: // Switch to supported OpenGL (ARGB888) mode on emulator
32: if (isAndroidEmulator())
33: this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);
34:
35: //設定Cocos2dxGLSurfaceView的Render
36: this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
37: this.mGLSurfaceView.setCocos2dxEditText(edittext);
38:
39: // Set framelayout as the content view
40: setContentView(mFrameLayout);
41: }
我們知道,cocos2d-x是通過Opengl進行渲染的,可以斷定,代碼中的這兩句話一定起了比較重要的作用:
進入Cocos2dxRenderer裡面:
不言自明了吧! 正是在這裡,java層與本地代碼(c++代碼)之間產生了聯絡,我們看到,Cocos2dxRenderer類型中聲明了很多本地方法,在其中的 nativeInit() 中進入了C++層面,進而開始一系列引擎的初始化。那麼 nativeInit() 方法在哪裡呢?進入 cocos2d\cocos\platform\android 目錄,開啟其中的 javaactivity.cpp :
你看,是不是和Win32下面的入口差不多了呢? 後面的就留給大家自己看了吧! 可以參考我上一篇寫Win32平台下啟動過程的文章。
後面寫的比較倉促,也是剛學著寫部落格不久,如有不足之處,還望各位海涵。
轉載請註明。
cocos2d-x 3.2 啟動過程分析 - win32 與 android 平台(二)