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

2023-10-25 11:20

本文主要是介绍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内容:

     

[cpp] view plain copy print ?
  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


[cpp] view plain copy print ?
  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

[cpp] view plain copy print ?
  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. }  
  
[cpp] view plain copy print ?
  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就是转好之后的字符串  


这篇关于cocos2d-x使用iconv库并且解决交叉编译的错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/282210

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.