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

相关文章

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的