cocos2d-3.8.1 交叉编译 安卓版本
2016-01-09 23:52
531 查看
一、编译所需要的软件和环境(android和c++交叉编译)
cocos2d-x
jdk
apache ant
python
android sdk
android 模拟器
android ndk
二、交叉编译、打包和运行
1.免手动配置Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)\
FILE_LIST += $(wildcard $(LOCAL_PATH)/hellocpp/*.cpp)\
FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)\
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
$(call import-module,audio/android)
$(call import-module,ui)
$(call import-module,extensions)
2.命令行编译
F:\cocos2d-x-3.8.1\projects\Ada\proj.android>cocos
F:\cocos2d-x-3.8.1\tools\cocos2d-console\bin\/cocos.py 2.0 - cocos console: coco
s2d-x 的命令行工具集。
可用的命令:
run 在设备或者模拟器上编译,部署和运行工程。
gen-libs 生成引擎的预编译库。生成的库文件会保存在引擎根目录的 'p
rebuilt' 文件夹。
luacompile 对 lua 文件进行加密和编译为字节码的处理。
deploy 编译并在设备或模拟器上部署工程。
package 管理 cocos 中的 package。
compile 编译并打包工程。
framework 管理工程使用的 frameworks。
gen-simulator 生成 Cocos 模拟器。
new 创建一个新的工程。
jscompile 对 js 文件进行加密和压缩处理。
gen-templates 生成用于 Cocos Framework 环境的模板。
可用的参数:
-h, --help 显示帮助信息。
-v, --version 显示命令行工具的版本号。
--ol ['en', 'zh', 'zh_tr'] 指定输出信息的语言。
示例:
cocos new --help
cocos run --help
F:\cocos2d-x-3.8.1\projects\Ada\proj.android>cocos compile
执行命令:compile
未指定平台。
请使用 '-p' 或者 '--platform' 来指定。
可用的平台有:['win32', 'android', 'wp8_1', 'metro']
3.eclipse编译
三、平台移植问题小结
1.白屏问题
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.view.WindowManager;
import android.media.AudioManager;
public class AppActivity extends Cocos2dxActivity {
public Cocos2dxGLSurfaceView onCreateView() {
super.onCreateView();
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
return glSurfaceView;
}
}
2.中文乱码
在VS下面开发Cocos程序的时候,他的默认编码是GBK的,但是在迁移或者是编译调试的时候要求UTF的编码更为方便。因此便有了将C++文件的编码格式转换为UTF-8的需求问题。
这个问题,当然可以在建立文件保存的时候选择高级保存选择,然后选择保存的格式。
但是,显然,在项目文件很多的时候,这个不是一个聪明的选择。所以,就要想办法如何批量的转化处理。
在Linux下面有专门的命令可以实现这个功能。
在Windows下面要如何做呢?
当然,借助于我们万能的C++一样可以很方便的解决它,经过一番查找资料,现在共享一下我的解决方法,首先,要在VS里面建立一个VC的控制台程序项目。
然后新建一个convert源文件。代码如下:
// 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <afxwin.h>
#include <string>
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
void recursiveFile(CString strFileType);
void convertGBToUTF8(CString strWritePath, const char* gb2312);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
/*for(int i = 0; i < argc; i++)
{
MessageBox(NULL, argv[i], L"Arglist contents", MB_OK);
}*/
//声明一个CFileFind类变量,以用来搜索
//接受一个参数作为源代码文件的根目录
TCHAR *lpszDirName = argv[1];
CString strFileType;
strFileType.Format(_T("%s\\*.*"), lpszDirName);
//递归此目录下的.h文件和.cpp文件,如果发现不是utf8编码则转换为utf8编码
recursiveFile(strFileType);
}
return nRetCode;
}
void recursiveFile(CString strFileType)
{
CFileFind finder;
BOOL isFinded = finder.FindFile(strFileType);//查找第一个文件
while (isFinded)
{
isFinded = finder.FindNextFile(); //递归搜索其他的文件
if (!finder.IsDots()) //如果不是"."目录
{
CString strFoundFile = finder.GetFilePath();
if (finder.IsDirectory()) //如果是目录,则递归地调用
{
CString strNextFileType;
strNextFileType.Format(_T("%s\\*.*"), strFoundFile);
recursiveFile(strNextFileType);
}
else
{
//如果是头文件或cpp文件
if (strFoundFile.Right(4) == _T(".cpp") || strFoundFile.Right(2) == _T(".h")) {
CFile fileReader(strFoundFile, CFile::modeRead);
byte head[3];
fileReader.Read(head, 3);
//判断是否带有BOM文件头
if (head[0] == 0xef && head[1] == 0xbb && head[2] == 0xbf)
{
fileReader.Close();
continue;
}
fileReader.SeekToBegin();
int bufLength = 256;
char *buf = new char[bufLength];
ZeroMemory(buf, bufLength);
int nReadLength;
std::string strContent;
while ((nReadLength = fileReader.Read(buf, bufLength)))
{
strContent.append(buf, nReadLength);
ZeroMemory(buf, nReadLength);
}
delete buf;
fileReader.Close();
convertGBToUTF8(strFoundFile, strContent.c_str());
TCHAR* fileName = new TCHAR[strFoundFile.GetLength() + 1];
//wcscpy_s(*fileName, strFoundFile);
// 中文路径存在问题,可以将下面的输出屏蔽,程序将静默运行
printf("%S已经转换为UTF-8编码", strFoundFile.GetBuffer(0));
cout << endl;
if (_tcslen(fileName) >0)
{
delete[] fileName;
}
}
}
}
}
finder.Close();
}
void convertGBToUTF8(CString strWritePath, const char* gb2312)
{
CFile fp;
fp.Open(strWritePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, NULL);
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
str[len] = '\n';
const unsigned char aryBOM[] = { 0xEF, 0xBB, 0xBF };
fp.Write(aryBOM, sizeof(aryBOM));
fp.Write(str, len);
delete[] str;
fp.Close();
}
如果编译出现错误请点击,项目--属性--一般------MFC的使用选择共享DLL的方式。
然后将编译成功的.exe文件放在项目的目录下,比如:
然后选择项目,属性的与生成事件,将要转换的源码目录放在.exe 的后面即可,这样虽然在您编写的时候保存的是GBK,但是在项目进行编译之前会把指定目录下的所有C++源码文件转换为UTF-8的格式,具体格式如下:
当然,您也可以直接在cmd中运行该exe文件,在后面加上要转换的目录即可。格式为: convert.exe Dir
这样在编译之前就会先将源码文件格式转换为UTF-8的格式。
cocos2d-x
jdk
apache ant
python
android sdk
android 模拟器
android ndk
二、交叉编译、打包和运行
1.免手动配置Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.cpp)\
FILE_LIST += $(wildcard $(LOCAL_PATH)/hellocpp/*.cpp)\
FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)\
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
$(call import-module,audio/android)
$(call import-module,ui)
$(call import-module,extensions)
2.命令行编译
F:\cocos2d-x-3.8.1\projects\Ada\proj.android>cocos
F:\cocos2d-x-3.8.1\tools\cocos2d-console\bin\/cocos.py 2.0 - cocos console: coco
s2d-x 的命令行工具集。
可用的命令:
run 在设备或者模拟器上编译,部署和运行工程。
gen-libs 生成引擎的预编译库。生成的库文件会保存在引擎根目录的 'p
rebuilt' 文件夹。
luacompile 对 lua 文件进行加密和编译为字节码的处理。
deploy 编译并在设备或模拟器上部署工程。
package 管理 cocos 中的 package。
compile 编译并打包工程。
framework 管理工程使用的 frameworks。
gen-simulator 生成 Cocos 模拟器。
new 创建一个新的工程。
jscompile 对 js 文件进行加密和压缩处理。
gen-templates 生成用于 Cocos Framework 环境的模板。
可用的参数:
-h, --help 显示帮助信息。
-v, --version 显示命令行工具的版本号。
--ol ['en', 'zh', 'zh_tr'] 指定输出信息的语言。
示例:
cocos new --help
cocos run --help
F:\cocos2d-x-3.8.1\projects\Ada\proj.android>cocos compile
执行命令:compile
未指定平台。
请使用 '-p' 或者 '--platform' 来指定。
可用的平台有:['win32', 'android', 'wp8_1', 'metro']
3.eclipse编译
三、平台移植问题小结
1.白屏问题
package org.cocos2dx.cpp;
import org.cocos2dx.lib.Cocos2dxActivity;
import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import android.view.WindowManager;
import android.media.AudioManager;
public class AppActivity extends Cocos2dxActivity {
public Cocos2dxGLSurfaceView onCreateView() {
super.onCreateView();
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
return glSurfaceView;
}
}
2.中文乱码
在VS下面开发Cocos程序的时候,他的默认编码是GBK的,但是在迁移或者是编译调试的时候要求UTF的编码更为方便。因此便有了将C++文件的编码格式转换为UTF-8的需求问题。
这个问题,当然可以在建立文件保存的时候选择高级保存选择,然后选择保存的格式。
但是,显然,在项目文件很多的时候,这个不是一个聪明的选择。所以,就要想办法如何批量的转化处理。
在Linux下面有专门的命令可以实现这个功能。
在Windows下面要如何做呢?
当然,借助于我们万能的C++一样可以很方便的解决它,经过一番查找资料,现在共享一下我的解决方法,首先,要在VS里面建立一个VC的控制台程序项目。
然后新建一个convert源文件。代码如下:
// 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <afxwin.h>
#include <string>
#include <iostream>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
void recursiveFile(CString strFileType);
void convertGBToUTF8(CString strWritePath, const char* gb2312);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
/*for(int i = 0; i < argc; i++)
{
MessageBox(NULL, argv[i], L"Arglist contents", MB_OK);
}*/
//声明一个CFileFind类变量,以用来搜索
//接受一个参数作为源代码文件的根目录
TCHAR *lpszDirName = argv[1];
CString strFileType;
strFileType.Format(_T("%s\\*.*"), lpszDirName);
//递归此目录下的.h文件和.cpp文件,如果发现不是utf8编码则转换为utf8编码
recursiveFile(strFileType);
}
return nRetCode;
}
void recursiveFile(CString strFileType)
{
CFileFind finder;
BOOL isFinded = finder.FindFile(strFileType);//查找第一个文件
while (isFinded)
{
isFinded = finder.FindNextFile(); //递归搜索其他的文件
if (!finder.IsDots()) //如果不是"."目录
{
CString strFoundFile = finder.GetFilePath();
if (finder.IsDirectory()) //如果是目录,则递归地调用
{
CString strNextFileType;
strNextFileType.Format(_T("%s\\*.*"), strFoundFile);
recursiveFile(strNextFileType);
}
else
{
//如果是头文件或cpp文件
if (strFoundFile.Right(4) == _T(".cpp") || strFoundFile.Right(2) == _T(".h")) {
CFile fileReader(strFoundFile, CFile::modeRead);
byte head[3];
fileReader.Read(head, 3);
//判断是否带有BOM文件头
if (head[0] == 0xef && head[1] == 0xbb && head[2] == 0xbf)
{
fileReader.Close();
continue;
}
fileReader.SeekToBegin();
int bufLength = 256;
char *buf = new char[bufLength];
ZeroMemory(buf, bufLength);
int nReadLength;
std::string strContent;
while ((nReadLength = fileReader.Read(buf, bufLength)))
{
strContent.append(buf, nReadLength);
ZeroMemory(buf, nReadLength);
}
delete buf;
fileReader.Close();
convertGBToUTF8(strFoundFile, strContent.c_str());
TCHAR* fileName = new TCHAR[strFoundFile.GetLength() + 1];
//wcscpy_s(*fileName, strFoundFile);
// 中文路径存在问题,可以将下面的输出屏蔽,程序将静默运行
printf("%S已经转换为UTF-8编码", strFoundFile.GetBuffer(0));
cout << endl;
if (_tcslen(fileName) >0)
{
delete[] fileName;
}
}
}
}
}
finder.Close();
}
void convertGBToUTF8(CString strWritePath, const char* gb2312)
{
CFile fp;
fp.Open(strWritePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, NULL);
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
str[len] = '\n';
const unsigned char aryBOM[] = { 0xEF, 0xBB, 0xBF };
fp.Write(aryBOM, sizeof(aryBOM));
fp.Write(str, len);
delete[] str;
fp.Close();
}
如果编译出现错误请点击,项目--属性--一般------MFC的使用选择共享DLL的方式。
然后将编译成功的.exe文件放在项目的目录下,比如:
然后选择项目,属性的与生成事件,将要转换的源码目录放在.exe 的后面即可,这样虽然在您编写的时候保存的是GBK,但是在项目进行编译之前会把指定目录下的所有C++源码文件转换为UTF-8的格式,具体格式如下:
当然,您也可以直接在cmd中运行该exe文件,在后面加上要转换的目录即可。格式为: convert.exe Dir
这样在编译之前就会先将源码文件格式转换为UTF-8的格式。
相关文章推荐
- Cocos2d-x中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!
- 使用C++进行Cocos2d-x游戏开发入门过程中的要点解析
- Cocos2d-x的内存管理总结
- Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决