本文主要是介绍cocos2d-x使用iconv库并且解决交叉编译的错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
客户端使用的是cocos2d-x-2.0.4,是一个比较老的版本了。使用cygwin和eclipse交叉编译出APK包。环境搭建另外写一篇文章,这边主要讲使用iconv库。很多人尝试在解决乱码问题时,也都会尝试使用iconv库,但因为遇到各种问题而放弃,比较常见的有找不到"iconv.h",或者是编译之后找不到iconv_open, iconv_close等函数。
在这次使用iconv库的过程中,参考了一些文章,大家也可以移步去看看。
http://bbs.csdn.net/topics/390285784?page=1#post-393310132
http://codingnow.cn/cocos2d-x/1038.html
乱码问题目前遇到的是写在客户端上的文字在真机上乱码,服务端发送到客户端的文字乱码。以前看到一篇文章,说有三种解决方案。
1、客户端全部使用UTF-8文件。
这种办法对于写在客户端上的文字还是挺有用的,但对于服务端发送过来的中文就显示乱码了,我们当前正是使用这种方法。
2、使用iconv库。
当时也尝试过,但总是遇到各种问题,加上进度问题,就放弃了,转而使用第1种方法。
3、使用xml文件读取。
这个对于单机游戏来说,优于第1种方法,特别是以后想发展国外市场需要多语言版的。配上rapidxml解析库,还是挺不错的。
iconv的配置使用过程:
1、默认是搭建好安卓打包环境的。
2、下载iconv库。
大家可以去官网上下载:http://ftp.gnu.org/pub/gnu/libiconv/
网速不好的或者打不开的,可以到我的资源里边下载:
http://download.csdn.net/detail/alex_my/6036049
大家下载下来后,比如是libiconv-114,可以将文件夹重命名成iconv。
3、解压iconv库
大家将下载到的iconv库解压至项目根目录。也就是和cocos2dx, extensions这些库的同级目录。gameclient01是我的游戏代码,详情可以见Cocos2d-x 搭建安卓编译环境
4、编写iconv库所需的Android.mk。
这步要仔细看了,很多文章这步没写清楚,让我走了许多冤枉路。
进入到刚才解压出的iconv文件夹,用记事本之类的建立一个Android.mk文件,这其实相当于linux的makefile文件。
Android.mk内容:
- LOCAL_PATH:= $(call my-dir)
- #libiconv.so
- include $(CLEAR_VARS)
- LOCAL_MODULE := iconv_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)
5、编写Android项目里面的Android.mk文件。
在搭建安卓编译环境的时候,大家写了一个Android.mk。这个相当于把所有库的Android.mk做了一个汇总。
这个Android.mk位于gameclient01/proj.android/jni下。打开后,拉到尾部:
这个尾部的内容原本是这样的:
请大家修改成这样:
红色部分是修改的地方。
第一个红圈增加了一些路径依赖。只要大家以下两个文件是这么放的,路径就不会有错,就不用纠结于多少个../,当然,大家也可以直接写上绝对路径。
iconv文件夹位置: cocos2d-x-2.0.4-1/iconv
安卓环境汇总的 Android.mk: cocos2d-x-2.0.4-1/gameclient01/proj.android/jni/Android.mk
第二个红圈增加了一个iconv_static,这个是在iconv/Android.mk中命名的。
第三个红圈中的iconv其实就是我们下载的iconv库的文件夹名字。
6、到此,配置就结束了。大家可以使用cygwin编译看看:
7、在项目中使用:
写两个函数:
Convert(...),
GBKToUTF8(...);
头文件:IconvString.h
- #ifndef __ICONV_STRING_H__
- #define __ICONV_STRING_H__
- /*
- * 字符转换函数集合
- * 本文件为gbk形式
- */
- // 如果编译报错:size_t未找到,请包含以下头文件
- #include <cstddef>
- void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen);
- #endif // __ICONV_STRING_H__
源文件:IconvString.cpp
- #include "IconvString.h"
- #ifdef WIN32
- #include "iconv.h"
- #else
- #include "../../../iconv/include/iconv.h"
- #endif
- #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
- #pragma comment(lib, "libiconv.lib")
- #endif
- static void Convert(char* from_charset, char* to_charset, char* inbuf, size_t inlen, char* outbuf, size_t outlen)
- {
- iconv_t iconvH = iconv_open(to_charset, from_charset);
- if(!iconvH)
- return;
- memset(outbuf, 0, outlen);
- #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
- const char* pTemp = inbuf;
- const char** pIn = &pTemp;
- char** pOut = &outbuf;
- if(!iconv(iconvH, pIn, &inlen, pOut, &outlen))
- {
- iconv_close(iconvH);
- return;
- }
- #else
- if(!iconv(iconvH, &inbuf, &inlen, &outbuf, &outlen))
- {
- iconv_close(iconvH);
- return;
- }
- #endif
- iconv_close(iconvH);
- }
- void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen)
- {
- Convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
- }
- // 示例文件使用的是默认的gbk文件
- const char* pszBuffer = "你好啊";
- size_t inlen = strlen(pszBuffer);
- size_t outlen << 1;
- char* outlen = (char*)malloc(outlen);
- char* pszBuffer2 = new char[inlen];
- strncpy(pszBuffer2, pszBuffer, inlen);
- GBKToUTF8(pszBuffer2, inlen, outbuf, outlen);
- // outbuf就是转好之后的字符串
这篇关于cocos2d-x使用iconv库并且解决交叉编译的错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!