cocos2d-x引入中文支持库并移植到android平台
2013-09-01 17:10:17| 分类: android | 标签:libiconv iconv cocos2d-x 中文 android |字号大中小订阅
在cocos2d-x中直接使用中文会显示乱码,什么从xml文件读取中文,将文件格式保存为utf-8,都不是解决方法,会出现一些其它的问题。Cocos2d-x提供了iconv库,解决中文问题。
1》 win32环境
1.1》 vs环境配置
引入头文件,cocos2d-x根目录下cocos2d\platform\third_party\win32\iconv
引入库,libiconv.lib
1.2》 代码
#include "iconv.h" int code_convert(const char *from_charset, const char *to_charset, const char *inbuf, size_t inlen, char *outbuf, size_t outlen) { iconv_t cd; const char *temp = inbuf; const char **pin = &temp; char **pout = &outbuf; memset(outbuf,0,outlen); cd = iconv_open(to_charset,from_charset); if(cd==0) return -1; if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; iconv_close(cd); return 0; } std::string u2a(const char *inbuf) { size_t inlen = strlen(inbuf); char * outbuf = new char[inlen * 2 + 2]; std::string strRet; if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0) { strRet = outbuf; } delete [] outbuf; return strRet; } std::string a2u(const char *inbuf) { size_t inlen = strlen(inbuf); char * outbuf = new char[inlen * 2 + 2]; std::string strRet; if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0) { strRet = outbuf; } delete [] outbuf; return strRet; } //使用 CCLabelTTF* pStartLabel = CCLabelTTF::create(a2u("开始").c_str(), "Arial", 60); |
2》 android环境
android下就不能直接使用cocos2d-x提供的iconv库,需要下载一个已经在linux环境下编译好的iconv库。下载地址:http://download.csdn.net/detail/wanrue/6192757
2.1》使用cygwin对libiconv库进行编译
安装cygwin,注意安装Devel(开发)目录下附加项,否则会提示没有make等命令。
从官网下载libiconv-1.14.tar.gz包,打开cygwin,解压,进入libiconv-1.14根目录,执行./configure,然后执行make。这样就已经成功编译好android平台下使用的libiconv包了。
2.2》环境配置
1. 将libiconv放置在cocos2d-x-2.1.4根目录下
2. 在libiconv目录下新建Android.mx文件,内容如下:
LOCAL_PATH:= $(call my-dir) #libiconv.so include $(CLEAR_VARS) LOCAL_MODULE := libiconv_static LOCAL_MODULE_FILENAME := libiconv LOCAL_CFLAGS := \ -Wno-multichar \ -DAndroid \ -DLIBDIR="c" \ -DBUILDING_LIBICONV \ -DIN_LIBRARY LOCAL_SRC_FILES := \ libcharset/lib/localcharset.c \ lib/iconv.c \ lib/relocatable.c LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/libcharset \ $(LOCAL_PATH)/lib \ $(LOCAL_PATH)/libcharset/include \ $(LOCAL_PATH)/srclib include $(BUILD_STATIC_LIBRARY) |
3.与Classes平级目录下新建thirdparty目录,将libiconv目录中include目录下的iconv.h文件拷贝进去。
4.编辑proj.android项目下jni目录中Android.mx文件。
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \ $(LOCAL_PATH)/../../thirdparty LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static LOCAL_WHOLE_STATIC_LIBRARIES += libiconv_static include $(BUILD_SHARED_LIBRARY) $(call import-module,libiconv) $(call import-module,cocos2dx) |
2.3》可能会出现的错误
2.3.1》如果在libiconv目录下没有Android.mx文件,那么ndk会找不到libiconv模块,提示:
Android NDK: jni/Android.mk: Cannot find module with tag 'libiconv' in import path Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ? Android NDK: The following directories were searched: Android NDK: jni/Android.mk:30: *** Android NDK: Aborting. . Stop. |
2.3.2》localcharset.c文件错误
D:\cocos2d-x-2.1.4\cocos2d-x-2.1.4/libiconv/libcharset/lib/localcharset.c: In function 'get_charset_aliases': D:\cocos2d-x-2.1.4\cocos2d-x-2.1.4/libiconv/libcharset/lib/localcharset.c:130:8: error: 'c' undeclared (first use in this function) D:\cocos2d-x-2.1.4\cocos2d-x-2.1.4/libiconv/libcharset/lib/localcharset.c:130:8: note: each undeclared identifier is reported only once for each function it appears in make: *** [obj/local/armeabi/objs/iconv_static/libcharset/lib/localcharset.o] Error 1 |
解决办法:
修改libiconv\libcharset\lib下localcharset.c文件,将int c声明提前。
113 get_charset_aliases (void)
114 {
115 int c;//
116 const char *cp;
157 for (;;)
158 {
159 //int c;
160 char buf1[50+1];
一些可能有用的参考:
[Cocos2D-X]使用iconv解决VS上中文显示乱码的问题+android导入第三方库iconv