cocos2d-x使用iconv库并且解决交叉编译的错误

近来在客户端搭建打包APK的环境,以及解决中文乱码问题。网上找了很多资料,但总是各种不详细,非常麻烦。因此在这里把自己的过程详细记录下,如果有哪步不详细,请留言。

    客户端使用的是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内容:

     

  1. LOCAL_PATH:= $(call my-dir)  
  2. #libiconv.so   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE := iconv_static  
  6.   
  7. LOCAL_MODULE_FILENAME := libiconv  
  8.   
  9. LOCAL_CFLAGS := \  
  10.   -Wno-multichar \  
  11.   -DAndroid \  
  12.   -DLIBDIR="c" \  
  13.   -DBUILDING_LIBICONV \  
  14.   -DIN_LIBRARY  
  15.   
  16. LOCAL_SRC_FILES := \  
  17.   libcharset/lib/localcharset.c \  
  18.   lib/iconv.c \  
  19.   lib/relocatable.c  
  20.   
  21. LOCAL_C_INCLUDES += \  
  22.   $(LOCAL_PATH)/include \  
  23.   $(LOCAL_PATH)/libcharset \  
  24.   $(LOCAL_PATH)/lib \  
  25.   $(LOCAL_PATH)/libcharset/include \  
  26.   $(LOCAL_PATH)/srclib  
  27. include $(BUILD_STATIC_LIBRARY)  
    这部分不要写错了,大家尽量copy下来。

  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


  1. #ifndef __ICONV_STRING_H__   
  2. #define __ICONV_STRING_H__   
  3.   
  4. /* 
  5. * 字符转换函数集合 
  6. * 本文件为gbk形式 
  7. */  
  8.   
  9. // 如果编译报错:size_t未找到,请包含以下头文件   
  10. #include <cstddef>   
  11.   
  12. void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen);  
  13.   
  14. #endif // __ICONV_STRING_H__  
    

   源文件:IconvString.cpp

  1. #include "IconvString.h"   
  2.   
  3. #ifdef WIN32   
  4. #include "iconv.h"   
  5. #else   
  6. #include "../../../iconv/include/iconv.h"   
  7. #endif   
  8.   
  9.   
  10. #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)   
  11. #pragma comment(lib, "libiconv.lib")   
  12. #endif   
  13.   
  14. static void Convert(char* from_charset, char* to_charset, char* inbuf, size_t inlen, char* outbuf, size_t outlen)  
  15. {  
  16.     iconv_t iconvH = iconv_open(to_charset, from_charset);  
  17.     if(!iconvH)  
  18.         return;  
  19.     memset(outbuf, 0, outlen);  
  20. #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)   
  21.     const char* pTemp = inbuf;  
  22.     const char** pIn = &pTemp;  
  23.     char** pOut = &outbuf;  
  24.     if(!iconv(iconvH, pIn, &inlen, pOut, &outlen))  
  25.     {  
  26.         iconv_close(iconvH);  
  27.         return;  
  28.     }  
  29. #else   
  30.     if(!iconv(iconvH, &inbuf, &inlen, &outbuf, &outlen))  
  31.     {  
  32.         iconv_close(iconvH);  
  33.         return;  
  34.     }  
  35. #endif   
  36.     iconv_close(iconvH);  
  37. }  
  38.   
  39. void GBKToUTF8(char* inbuf, size_t inlen, char* outbuf, size_t outlen)  
  40. {  
  41.     Convert("gb2312""utf-8", inbuf, inlen, outbuf, outlen);  
  42. }  
  
  1. // 示例文件使用的是默认的gbk文件   
  2. const char* pszBuffer = "你好啊";  
  3. size_t inlen = strlen(pszBuffer);  
  4. size_t outlen << 1;  
  5. char* outlen = (char*)malloc(outlen);  
  6. char* pszBuffer2 = new char[inlen];  
  7. strncpy(pszBuffer2, pszBuffer, inlen);  
  8. GBKToUTF8(pszBuffer2, inlen, outbuf, outlen);  
  9. // outbuf就是转好之后的字符串  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值