cocos2d-x 3.2 啟動過程分析 - win32 與 android 平台(二)

來源:互聯網
上載者:User

標籤: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 平台(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.