加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【cocos2d-x 3.x 学习与应用总结】4: 使用cocos compile编译apk

发布时间:2020-12-14 17:14:23 所属栏目:百科 来源:网络整理
导读:前言 本文总结了在windows上使用 cocos compile 命令编译cocos2d-x安卓apk的基本用法,以及记录一个使用NDK-r9d(gcc 4.8)编译C++11的 hash_map 遇到的一个问题: error: invalid use of incomplete type 'struct std::hashMessageType' 。 cocos compile 基本

前言

本文总结了在windows上使用cocos compile命令编译cocos2d-x安卓apk的基本用法,以及记录一个使用NDK-r9d(gcc 4.8)编译C++11的hash_map遇到的一个问题:error: invalid use of incomplete type 'struct std::hash<MessageType>'

cocos compile 基本用法,编译debug版本的cpp-tests.

从2.x到3.x,cocos的辅助工具做的越来越完善了,2.x刚开始的时候编译apk是比较费劲的,除了最基本的安装JDK,NDK,AndroidSDK,Ant还要装cygwin,自己配环境变量,执行打包脚本等等。我最近使用的是cocos2d-x官方的github仓库中的默认v3分支最新代码(3.10),以编译cpp-tests工程为android apk为例,使用最新的打包方式:cocos compile.

基本的环境准备

如今的cocos,大量使用了Python作为其辅助工具,因此第一步就是装好python,推荐比较经典的2.7.x版本。

装好python之后就可以到引擎的根目录,执行setup.py来初始化cocos环境了,它会引导你配置好cocos命令行工具执行所需要的环境变量和工具。其中包括:

<code class="language-c++ hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Setting up cocos2d<span class="hljs-attribute" style="box-sizing: border-box;">-x</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span>
<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>Check environment <span class="hljs-built_in" style="color: rgb(102,102); box-sizing: border-box;">variable</span> COCOS_CONSOLE_ROOT
  <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>Search for environment <span class="hljs-built_in" style="color: rgb(102,102); box-sizing: border-box;">variable</span> COCOS_CONSOLE_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>COCOS_CONSOLE_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>codes<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>cocos2d<span class="hljs-attribute" style="box-sizing: border-box;">-x</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>tools<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>cocos2d<span class="hljs-attribute" style="box-sizing: border-box;">-console</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>bin

<span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> COCOS_X_ROOT
  <span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> COCOS_X_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>COCOS_X_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>codes

<span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> COCOS_TEMPLATES_ROOT
  <span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> COCOS_TEMPLATES_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>COCOS_TEMPLATES_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>templates

<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>Configuration for Android platform only,you can also <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">skip</span> <span class="hljs-literal" style="color: rgb(0,102,102); box-sizing: border-box;">and</span> manually edit your environment variables

<span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> NDK_ROOT
  <span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> NDK_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>NDK_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>Programs<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>android<span class="hljs-attribute" style="box-sizing: border-box;">-ndk</span><span class="hljs-attribute" style="box-sizing: border-box;">-r9d</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>

<span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> ANDROID_SDK_ROOT
  <span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> ANDROID_SDK_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>ANDROID_SDK_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>adt<span class="hljs-attribute" style="box-sizing: border-box;">-bundle</span><span class="hljs-attribute" style="box-sizing: border-box;">-windows</span><span class="hljs-attribute" style="box-sizing: border-box;">-x86_64</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">20131030</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>sdk

<span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> ANT_ROOT
  <span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">variable</span> ANT_ROOT<span class="hljs-attribute" style="box-sizing: border-box;">...</span>
    <span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">-></span>ANT_ROOT is found : D:<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>programs<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>apache<span class="hljs-attribute" style="box-sizing: border-box;">-ant</span><span class="hljs-subst" style="color: rgb(0,102); box-sizing: border-box;">1.9</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">.4</span><span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span>bin<span class="hljs-subst" style="color: rgb(0,0); box-sizing: border-box;">&;/span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,221,221); list-style: none; text-align: right; opacity: 0.126783; background-color: rgb(238,238,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,221); list-style: none; text-align: right; background-color: rgb(238,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

其中几个常用SDK和NDK的下载和安装不再细说。在配置好之后,能看到像我上面这样的输出就ok了,相对于2.x中要做的工作,这样的引导是安装已经很简单了。

在命令行执行打包命令

配置好环境之后,打包就非常简单了。对于cocos自带的cpp-tests项目,打包apk有两种操作方法:

方法1

在引擎根目录/build/目录下,执行python android_build.py cpp-tests即可。建议在cmd窗口中操作,可以看到真个过程,包括异常退出等情况。关于android_build.py的更多用法请参考其文件内容,里面有usage说明。

方法2

在引擎根目录/tests/cpp-tests/目录,执行cocos命令:

 

其实,两种方法都是使用了cocos compile这个命令行工具。关于其完整的用法请在cmd中输入cocos compile -h即可查看帮助信息。第一种方式中的脚本android_build.py其实是使用-s参数来调用cocos compile命令,-s选项指定了工程的目录地址。即可。自己打开瞧瞧它的内容就知道了。很简单。

自己创建的项目打包apk

使用cocos new命令创建的工程如何打包成apk?

也很简单,跟cpp-tests是一样的过程,也是使用cocos compile命令。在执行命令之前,比cpp-tests多的一步操作是,添加自己写的C++源代码文件名称和包含路径到Android.mk.

假设项目名字叫”Dog”

第一步,添加文件包含路径和cpp文件名到Dog/proj.android/jni/Android.mk

例如下面的Android.mk文件是我的游戏目录下/proj.android/jni/Android.mk文件,其中那一堆cpp就是自己写的cpp源代码,要参与到二进制编译的cpp都要加进来。

<code class="language-c++ hljs tex has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">LOCAL_PATH := <span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,238);">$(call my-dir)

include $</span>(CLEAR_VARS)

<span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,238);">$(call import-add-path,$</span>(LOCAL_PATH)/../../cocos2d)
<span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,$</span>(LOCAL_PATH)/../../cocos2d/external)
<span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,$</span>(LOCAL_PATH)/../../cocos2d/cocos)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> 从hellocpp/main.cpp这行往下,是自己添加的cpp文件
LOCAL_SRC_FILES := hellocpp/main.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">
</span>                   ../../Classes<span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">AppDelegate</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">CCDirector</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">customs</span><span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">FlowLayout</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">Menu</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">data</span>_models<span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">TestDataCenter</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">LogicDirector</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">message</span><span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">Message</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">MessageCenter</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">PageManager</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">pages</span><span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">CameraTest</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">CCBPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">CCBTestPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">LittleTouchPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">MainPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">NodeTestPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">RootPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">ScrollviewTestPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">SuperPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">TestEntranceLayer</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">TouchTestPage</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">util</span><span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">CocosWindow</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">cocos</span>_util.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">DrawNode</span>3D.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">StringUtil</span>.cpp <span class="hljs-command" style="box-sizing: border-box; color: rgb(0,136);">ShaderTest</span>.cpp 


<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> 文件的包含路径
LOCAL_C_INCLUDES := <span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,238);">$(LOCAL_PATH)/../../Classes

<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_HEADER_ANDROID_BEGIN
<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_HEADER_ANDROID_END


LOCAL_STATIC_LIBRARIES := cocos2dx_static

<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_LIB_ANDROID_BEGIN
<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_LIB_ANDROID_END

include $</span>(BUILD_SHARED_LIBRARY)

<span class="hljs-formula" style="box-sizing: border-box; font-style: italic; background-color: rgb(238,238);">$(call import-module,.)

<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_LIB_IMPORT_ANDROID_BEGIN
<span class="hljs-special" style="box-sizing: border-box; color: rgb(102,0);">#</span> _COCOS_LIB_IMPORT_ANDROID_END</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li></ul>

2. 在Dog/proj.android/目录下执行:cocos compile -p android

通过这两部就完成了自己创建项目的打包apk操作,可以注意到,比较复杂的就是第一步,在把自己的cpp文件加到Android.mk的时候,尤其是当你的cpp放的到处都是,像我的那样分散在多个子目录中。为了这一步的自动化,可以自己写个脚本。我这里分享一个很简单的小脚本,它可以遍历子目录,记录下所有的cpp文件。其实就是一个简单的类似unix命令tree的小脚本。

tree.py: 递归遍历子目录,统计所有.cpp文件,并写入完整路径到cpps.txt

<code class="language-python hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136,0); box-sizing: border-box;"># coding=utf-8</span>

<span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">import</span> os


<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">get_dir_tree</span><span class="hljs-params" style="color: rgb(102,102); box-sizing: border-box;">(begin_dir,coll)</span>:</span>
    files = os.listdir(begin_dir)
    <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">for</span> file_name <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">in</span> files:
        full_path = os.path.join(begin_dir,file_name)
        <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">if</span> os.path.isdir(full_path):
            get_dir_tree(full_path,coll)
        <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">else</span>:
            coll.append(full_path)


<span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">if</span> <span class="hljs-string" style="color: rgb(0,136,0); box-sizing: border-box;">"__main__"</span> == __name__:
    file_tree = []
    get_dir_tree(os.getcwd(),file_tree)

    <span class="hljs-comment" style="color: rgb(136,0); box-sizing: border-box;"># write .cpp file names into file</span>
    <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">with</span> open(<span class="hljs-string" style="color: rgb(0,0); box-sizing: border-box;">"cpps.txt"</span>,<span class="hljs-string" style="color: rgb(0,0); box-sizing: border-box;">"w"</span>) <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">as</span> f:
        <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">for</span> name <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">in</span> file_tree:
            <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">if</span> str(name).endswith(<span class="hljs-string" style="color: rgb(0,0); box-sizing: border-box;">".cpp"</span>):
                f.write(name + <span class="hljs-string" style="color: rgb(0,0); box-sizing: border-box;">" n"</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul>

把这个tree.py脚本丢到: 项目根目录/Classes/目录下,执行即可生成一个cpps.txt,里面记录了所有的cpp文件路径,然后按列选择/Classes/..../xxxx.cpp ,复制粘贴到Android.mk即可。

cpps.txt

 

C++11中的强类型枚举(scoped enum)作为hash表键值导致的编译错误

我的cocos代码中使用了一个强类型枚举作为键值的unordered_map,如下:

<code class="language-c++ hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">enum</span> <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">class</span> MessageType
{
    kMessageTypeChangePage = <span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">0</span>,kMessageTypePushPage,kMessageTypePopPage,kMessageTypeChangeBackground,};

<span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">class</span> MessageCenter : <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">public</span> Singleton<MessageCenter> {

    <span class="hljs-comment" style="color: rgb(136,0); box-sizing: border-box;">// ......</span>

<span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">private</span>:
    <span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">typedef</span> <span class="hljs-built_in" style="color: rgb(102,102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102,102); box-sizing: border-box;">vector</span><Message*></span>                           MessageQueue;
    MessageQueue                                            messages_;

    <span class="hljs-keyword" style="color: rgb(0,102); box-sizing: border-box;">set</span><PriorityHandler*></span>                      HandlerQueue;
    <span class="hljs-keyword" style="color: rgb(0,102); box-sizing: border-box;">unordered_map</span><MessageType,HandlerQueue></span>   HandlerMap;
    HandlerMap                                              handlerMap_;
};</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul>

其中的HandlerMap类型就是以enum class MessageType来作为键值的hash表,在windows上我使用visual studio 2013编译项目,顺利通过。

编译apk时就出问题了。在使用cocos compile -p android命令,使用NDK对上面的代码进行编译的时候,会发现如下错误:

<code class="language-c++ hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-constant" style="box-sizing: border-box;">In</span> file included from <span class="hljs-constant" style="box-sizing: border-box;">D</span><span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">:/programs/android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">4.8</span>/<span class="hljs-keyword" style="color: rgb(0,136); box-sizing: border-box;">include</span>/bits/hashtable.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">h:</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">35</span><span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0,from <span class="hljs-constant" style="box-sizing: border-box;">D</span><span class="hljs-symbol" style="color: rgb(0,136); box-sizing: border-box;">include</span>/<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">unordered_map:</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">47</span>,102); box-sizing: border-box;">:</span>codes&;span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">3.9</span>&;span class="hljs-constant" style="box-sizing: border-box;">PlayingWithCocos3D</span>proj.android../cocos2d/cocos/<span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">3</span>d/../renderer/<span class="hljs-constant" style="box-sizing: border-box;">CCTexture2D</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">32</span>,102); box-sizing: border-box;">3</span>d/../base/<span class="hljs-constant" style="box-sizing: border-box;">CCProtocols</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">34</span>,102); box-sizing: border-box;">3</span>d/../<span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">2</span>d/<span class="hljs-constant" style="box-sizing: border-box;">CCNode</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">2</span>d/<span class="hljs-constant" style="box-sizing: border-box;">CCScene</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">3</span>d/../base/<span class="hljs-constant" style="box-sizing: border-box;">CCDirector</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">37</span>,102); box-sizing: border-box;">3</span>d/../base/<span class="hljs-constant" style="box-sizing: border-box;">CCAsyncTaskPool</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">29</span>,102); box-sizing: border-box;">3</span>d/../cocos2d.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">41</span>,from jni/../../<span class="hljs-constant" style="box-sizing: border-box;">Classes</span>/util/cocos_util.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">3</span>,from jni/../../<span class="hljs-constant" style="box-sizing: border-box;">Classes</span>/cocos_include.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">4</span>,from jni/../../<span class="hljs-constant" style="box-sizing: border-box;">Classes</span>/message/<span class="hljs-constant" style="box-sizing: border-box;">MessageCenter</span>.<span class="hljs-symbol" style="color: rgb(0,from jni/../../<span class="hljs-constant" style="box-sizing: border-box;">Classes</span>message&;span class="hljs-constant" style="box-sizing: border-box;">MessageCenter</span>.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">cpp:</span><span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">1</span><span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">:</span>
<span class="hljs-constant" style="box-sizing: border-box;">D</span><span class="hljs-symbol" style="color: rgb(0,136); box-sizing: border-box;">include</span>/bits/hashtable_policy.<span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">1082</span><span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">53</span><span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">:</span> <span class="hljs-symbol" style="color: rgb(0,102); box-sizing: border-box;">error:</span> invalid use of incomplete type <span class="hljs-string" style="color: rgb(0,0); box-sizing: border-box;">'struct std::hash<MessageType>'</span>
       using __ebo_h1 = _Hashtable_ebo_helper<<span class="hljs-number" style="color: rgb(0,102); box-sizing: border-box;">1</span>,_H1>;
                                                     ^</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

编译器抱怨说 : struct std::hash是不完整类型。它为什么会这样认为?这是因为hash表的定义需要一个hash函数,对于内置的数据类型,C++标准要求标准库要提供预定义的hash函数,在<functional>头文件里可以找到内置数据类型的hash函数定义:

 

而对于enum class类型C++标准并没有要求必须提供。windows上VC++编译器应该是提供了enum class的hash函数,因此编译能够通过。那么对于gcc编译器,要想解决这个问题就需要自己定义hash函数,针对我的enum class MessageType。

 

为了快点通过编译在android上看到我的游戏测试结果,我定义了一个很简单的hash函数,直接把enum的值转为size_t。

有了这个hash函数,NDK编译通过了并且打包成功。


作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!

在这里也能看到这篇文章:github博客,CSDN博客,欢迎访问

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读