此处为记录防止忘记,最近使用COCOS练习一些新的库,所以需要把PROTOBUF编译进去,看上去很麻烦,这里记录一下,以防忘记。

首先下载protobuf 2.5.0版本,下载地址请自行百度。

准备工作:

CYGWIN下载:http://cygwin.com/setup-x86.exe

1、请确保机器中有CYGWIN,并且CYGWIN必须安装好GCC,GDB和MAKE等,文章很多,请自行搜索

2、配置CYGWIN的NDK环境:

打开CYGWIN目录下的home\Administrator\.bash_profile,并在最下面添加内容:

NDK=/cygdrive/J/android-ndk-r10d

export NDK

重启CYGWIN,测试执行:cd $NDK ,此处NDK环境配置完毕

3、确保安装好COCOS2DX最新版

4、曾经使用过PROTOBUF,本文非PROTOBUF教程,为配置引导教程。

编译PROTOBUF ANDROID

解压缩PROTOBUF文件至COCOS目录,注意:为了防止文件混乱建议最好在COCOS根目录下新建名为THRDLIB的目录存放PROTOBUF。

解压后用WINDOWS版本先编译,如果出现MIN和MAX函数错误,只需要在:src\google\protobuf\io 目录下找到 zero_copy_stream_impl_lite.cc 文件,在文件头部增加 INCLUDE:#include <algorithm>,此处BUG修复,请安心兼容ANDROID。

(建议:请先新建一份COCOS的DEMO游戏,并将WINDOWS版本的PROTOBUF放入引用,新建对应的测试协议,确保在WINDOWS一切正常)

编译ANDROID版本步骤:

1、进入PROTOBUF解压所在目录

2、新建JNI目录,进入该目录

3、新建文件:Application.mk

内容:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti
APP_ABI := armeabi armeabi-v7a x86

解释:此处ABI为兼容COCOS的3中情况,分别编译3中类型的库,稍后会提供配置方式。

4、新建文件:Android.mk

内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := protobuf_static

LOCAL_MODULE_FILENAME := protobuf

LOCAL_SRC_FILES :=src/google/protobuf/io/coded_stream.cc \
src/google/protobuf/stubs/common.cc \
src/google/protobuf/descriptor.cc \
src/google/protobuf/descriptor.pb.cc \
src/google/protobuf/descriptor_database.cc \
src/google/protobuf/dynamic_message.cc \
src/google/protobuf/extension_set.cc \
src/google/protobuf/extension_set_heavy.cc \
src/google/protobuf/generated_message_reflection.cc \
src/google/protobuf/generated_message_util.cc \
src/google/protobuf/io/gzip_stream.cc \
src/google/protobuf/compiler/importer.cc \
src/google/protobuf/message.cc \
src/google/protobuf/message_lite.cc \
src/google/protobuf/stubs/once.cc \
src/google/protobuf/compiler/parser.cc \
src/google/protobuf/io/printer.cc \
src/google/protobuf/reflection_ops.cc \
src/google/protobuf/repeated_field.cc \
src/google/protobuf/service.cc \
src/google/protobuf/stubs/structurally_valid.cc \
src/google/protobuf/stubs/strutil.cc \
src/google/protobuf/stubs/substitute.cc \
src/google/protobuf/text_format.cc \
src/google/protobuf/io/tokenizer.cc \
src/google/protobuf/unknown_field_set.cc \
src/google/protobuf/wire_format.cc \
src/google/protobuf/wire_format_lite.cc \
src/google/protobuf/io/zero_copy_stream.cc \
src/google/protobuf/io/zero_copy_stream_impl.cc \
src/google/protobuf/io/zero_copy_stream_impl_lite.cc \
src/google/protobuf/stubs/stringprintf.cc LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_LDLIBS := LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/src LOCAL_LDLIBS := \
-llog \
-lz include $(BUILD_STATIC_LIBRARY)

5、回到上一级目录,将SRC目录整个拷贝至JNI目录下。

6、打开CYGWIN,进入PROTOBUF目录下(访问WINDOWS目录方法为:cd /cygdrive/f/protobuf)

7、输入:

$NDK/ndk-build

静静的等待安装完毕。

将protobuf安装至external目录

编译完毕protobuf后,我们开始安装对应的文件。

步骤如下(以COCOS2DX 3.8为例):

1、进入COCOS框架目录下:Cocos\Framework\frameworks\cocos2d-x-3.8\external

2、新建目录protobuf

3、在目录下新建 include 以及 prebuilt 目录 ,此处开始较为重要

4、将PROTOBUF目录下的src目录下的.h文件拷贝至COCOS框架下的external/protobuf/include目录下(注意COPY完毕后,其相对路径会是:external\protobuf\include\google)。

5、进入external/protobuf/prebuilt,新建目录android(如已经编译好WIN32版本,请直接新建WIN32目录,并COPY lib文件至该目录下)

6、回到PROTOBUF编译目录下的obj\local目录下,拷贝目录下的3个文件夹:armeabi、armeabi-v7a、x86 至COCOS框架目录下的:external/protobuf/prebuilt/android目录下,并记得删除每个目录内的obj文件夹,保留.a文件,别删错噢。

7、在external/protobuf/prebuilt/android目录下新建文件:Android.mk

内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := protobuf_static
LOCAL_MODULE_FILENAME := libprotobuf
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include
include $(PREBUILT_STATIC_LIBRARY)

8、进入COCOS的cocos2d-x-3.8\cocos\prebuilt-mk目录下 打开文件 Android.mk 文件,请务必使用NOTEPAD++或UE等工具打开,否则可能排版混乱

9、修改该文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dx_internal_static

LOCAL_MODULE_FILENAME := libcocos2dxinternal

ifeq ($(USE_ARM_MODE),)
LOCAL_ARM_MODE := arm
endif ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
MATHNEONFILE := math/MathUtil.cpp.neon
else
MATHNEONFILE := math/MathUtil.cpp
endif LOCAL_SRC_FILES := ..\..\prebuilt\android/$(TARGET_ARCH_ABI)/libcocos2dxinternal.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/.. \
$(LOCAL_PATH)/../. \
$(LOCAL_PATH)/../.. \
$(LOCAL_PATH)/../platform \
$(LOCAL_PATH)/../base \
$(LOCAL_PATH)/../../external \
$(LOCAL_PATH)/../../external/tinyxml2 \
$(LOCAL_PATH)/../../external/unzip \
$(LOCAL_PATH)/../../external/chipmunk/include/chipmunk \
$(LOCAL_PATH)/../../external/xxhash \
$(LOCAL_PATH)/../../external/nslog \
$(LOCAL_PATH)/../../external/poly2tri \
$(LOCAL_PATH)/../../external/poly2tri/common \
$(LOCAL_PATH)/../../external/poly2tri/sweep \
$(LOCAL_PATH)/../../external/clipper LOCAL_EXPORT_LDLIBS := -lGLESv2 \
-llog \
-landroid LOCAL_WHOLE_STATIC_LIBRARIES := cocos_freetype2_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_png_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_jpeg_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_tiff_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_webp_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_chipmunk_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_zlib_static
LOCAL_WHOLE_STATIC_LIBRARIES += recast_static
LOCAL_WHOLE_STATIC_LIBRARIES += bullet_static LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dxandroid_static # define the macro to compile through support/zip_support/ioapi.c
LOCAL_CFLAGS := -DUSE_FILE32API
LOCAL_CFLAGS += -fexceptions
LOCAL_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat
LOCAL_EXPORT_CFLAGS := -DUSE_FILE32API
LOCAL_EXPORT_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat include $(PREBUILT_STATIC_LIBRARY) #============================================================== include $(CLEAR_VARS) LOCAL_MODULE := cocos2dx_static
LOCAL_MODULE_FILENAME := libcocos2d
LOCAL_SRC_FILES := ..\..\prebuilt\android/$(TARGET_ARCH_ABI)/libcocos2d.a LOCAL_WHOLE_STATIC_LIBRARIES := cocostudio_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosbuilder_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos3d_static
LOCAL_WHOLE_STATIC_LIBRARIES += spine_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static
LOCAL_WHOLE_STATIC_LIBRARIES += audioengine_static
#此处增加额外的POTOBUF库文件
LOCAL_WHOLE_STATIC_LIBRARIES += protobuf_static include $(PREBUILT_STATIC_LIBRARY)
#==============================================================
$(call import-module,freetype2/prebuilt/android)
$(call import-module, platform/android/prebuilt-mk)
$(call import-module,png/prebuilt/android)
$(call import-module,zlib/prebuilt/android)
$(call import-module,jpeg/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)
$(call import-module,chipmunk/prebuilt/android)
$(call import-module, 3d/prebuilt-mk)
$(call import-module, audio/android/prebuilt-mk)
$(call import-module, editor-support/cocosbuilder/prebuilt-mk)
$(call import-module, editor-support/cocostudio/prebuilt-mk)
$(call import-module, editor-support/spine/prebuilt-mk)
$(call import-module, network/prebuilt-mk)
$(call import-module, ui/prebuilt-mk)
$(call import-module, extensions/prebuilt-mk)
$(call import-module, Box2D/prebuilt-mk)
$(call import-module, bullet/prebuilt-mk)
$(call import-module, recast/prebuilt-mk)
$(call import-module,curl/prebuilt/android)
$(call import-module,websockets/prebuilt/android)
$(call import-module, flatbuffers/prebuilt-mk)
#此处增加额外的PROTOBUF库
$(call import-module, protobuf/prebuilt/android)

至此,可以在COCOS STUDIO中尝试编译你的项目至ANDROID,PROTOBUF应该已经在里面了,而且不管新建几个项目,都会自动包含,不用另外配置。

此处额外分享一套自动搜索CPP,C以及CC文件的MK内容,不必挨个增加编译文件噢(适用于大部分COCOS项目,几乎不必修改任何内容,新增CPP也会编译在内,非常方便噢)。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := cocos2dcpp_shared

LOCAL_MODULE_FILENAME := libcocos2dcpp

# 遍历目录及子目录的函数
define walk
$(wildcard $()) $(foreach e, $(wildcard $()/*), $(call walk, $(e)))
endef # 遍历Classes目录
ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes) FILE_LIST := hellocpp/main.cpp
# 从所有文件中提取出所有.cpp文件
FILE_LIST += $(filter %.cpp, $(ALLFILES))
FILE_LIST += $(filter %.cc, $(ALLFILES))
FILE_LIST += $(filter %.c, $(ALLFILES)) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
#LOCAL_SRC_FILES += $(LOCAL_PATH)/../../libs/protobuf/android/$(TARGET_ARCH_ABI)/libprotobuf.a # 修改include路径
FILE_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)
LOCAL_C_INCLUDES := $(FILE_INCLUDES) #LOCAL_SRC_FILES := hellocpp/main.cpp \
# ../../Classes/AppDelegate.cpp \
# ../../Classes/HelloWorldScene.cpp
# ../../Classes/ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../libs/protobuf/include LOCAL_CFLAGS := -v # _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_STATIC_LIBRARIES += libprotobuf # _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END include $(BUILD_SHARED_LIBRARY) $(call import-module,./prebuilt-mk) # _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

[原创]COCOS2DX 3.8 增加protobuf为external库的更多相关文章

  1. cocos2d-x lua 中使用protobuf并对http进行处理

    cocos2d-x lua 中使用protobuf并对http进行处理 本文介绍 cocos2d-x lua 中使用http 和 基于cocos2d-x 对lua http的封装(部分ok) 本博客链 ...

  2. [cocos2dx笔记004] android添加�静态库project

    (基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的myli ...

  3. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  4. cocos2dx 3.x 集成protobuf

    vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程也可参考. 主要参考博文地址<cocos2dx 3.x C++搭建protobuf环 ...

  5. 【转】cocos2dx 3.x 集成protobuf

    http://www.cnblogs.com/chevin/p/6001872.html vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程 ...

  6. [原创]cocos2d-x研习录-第三阶 背景音乐和音效

    在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...

  7. [原创]cocos2d-x研习录-第三阶 特性之触屏

    游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...

  8. [原创]cocos2d-x研习录-第二阶 概念类之场景类(CCScene)

    场景类CCScene是Cocos2D-x在屏幕显示的内容,相当于游戏关卡或界面.CCDirector任何时候只能显示一个场景CCScene,游戏中可能存在若干场景,CCDirector通过场景切换达到 ...

  9. [原创]cocos2d-x研习录-第三阶 多分辨率适配器

    在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...

随机推荐

  1. GOF23设计模式之中介者模式(mediator)

    一.中介者模式概述 如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量多对多的关系,导致关系及其复杂,这时可以引入一个中介者对象,使得各个对象只跟中介者对象打交道,从而将复杂的网络结构化为星型 ...

  2. python 面向对象(类的特殊成员)

    python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...

  3. Java堆外内存之七:JVM NativeMemoryTracking 分析堆外内存泄露

    Native Memory Tracking (NMT) 是Hotspot VM用来分析VM内部内存使用情况的一个功能.我们可以利用jcmd(jdk自带)这个工具来访问NMT的数据. NMT介绍 工欲 ...

  4. 利用html5制作一个时钟动画

    <canvas id="clock" width="500" height="500" style="background- ...

  5. Servlet3.0的简单使用

    Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,虽然目前最新的版本是3.1,对应版本JavaEE7.我们目前使用的做多的还是Servlet2.5的东西 ...

  6. 【BZOJ】1441 Min(数学)

    题目 传送门:QWQ 分析 裴蜀定理. 因为存在 $ a_1 $ $ a_2 $...... $ a_n $的最大公约数为 $ d $,那么必定存在 $ x_1*a_1+x_2*a_2+...x_n* ...

  7. 【学习笔记】dp基础

    知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. dp基础,主要是做题,只有练习才能彻底掌握. 洛谷P1417 烹调方案 分析:由于时间的先后会对结果有影响,所以c[i ...

  8. sgdisk基本用法

    简介 sgdisk是Linux下操作GPT分区的工具,就像fdisk是操作MBR分区的工具.关于GPT和MBR的区别请参考: http://www.anchor.com.au/blog/2012/10 ...

  9. html中的一些常用的样式标签

    html中的一些常用的样式标签 <p>这里是文本,<mark>高亮</mark></p> <strong>加粗,加重语气</stron ...

  10. 这样学Linux基本命令,事半功倍

    命令基本格式 (1)命令提示符 如下是命令行的命令提示符,以此为例,讲解含义. 其中: root 当前登录用户名 localhost 主机名 ~ 当前所在的目录(即家目录,用户登录的初始位置) # 超 ...