cocos2dx android平台 解决iconv库的移植问题

    当我写这篇文章的时候我是怀着激动的心情的,因为我又解决了一个技术问题。你可能对题目还一知半解,这是什么意思,我之所以要写这篇文章就是要解决当我们在cocos2dx中使用了第三方库的时候,移植到android平台的过程中是会报错的问题,典型的例子就是我在上几篇博客中使用了编码转换的库iconv,在我移植到android平台测试的时候就出现了错误,各种各样的错误,网上搜了一下,但是网上的方法感觉都很老了,有的也没说明白,今天通过摸索马上分享给大家,让大家也少走歪路。

如果你还不会移植android平台,请先看我上一篇的博客,先换个其他的不包含iconv库的工程,移植成功了再来做今天的事情。今天我们不需要准备任何工具,需要做的就是理解.mk文件的含义,知道怎么改。我们先来看一下我字体和字符编码这篇博客GBKToUTF8的头文件是怎么包含iconv库的。

1 #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
2 #include "iconv\iconv.h"
3 #else
4 #include "../../../../libiconv/include/iconv.h"
5 #endif

如果是win32平台的话就用引擎里边的第三方库,这个iconv库所在的路径是
E:\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\platform\third_party\win32\iconv。但如果是移植到android平台的你需要加上你android平台的库的路径,也就是说你需要先下载好iconv的库,放到一个你的路径,这里我放到的是我引擎的根目录下,所以写的就是上边的代码,大家下去下载这个库,然后按我说的改了代码。然后我们就来看看这个.mk文件改怎么改,我们要修改的是jni目录下的.mk文件,我先截上几张图片,说说里边代码的含义。

cocos2dx使用了第三方库照样移植android平台上边的这张图片网上有不少的教程都说需要修改,但在我看来根本不是,因为当我在这里加了iconv.h的路径以后编译的时候任然报错,说找不到iconv.h这个文件。所以以后大家也不要改这里,没用的。cocos2dx使用了第三方库照样移植android平台cocos2dx使用了第三方库照样移植android平台上边的第一张图片看到了划线的地方了吗?这个是我加上去的,你需要改吗?答案是需要的,但是名字可以和我不一样,那名字改成什么样的呢,这得看另一个文件了,我们等等再说。上面的第二张图片那个划线的地方也是我加上去的,你也需要修改,改成什么也需要看另一个文件。好了现在我们就来说到底看哪个文件。这个文件就是你下载的iconv库的根目录下的Android.mk文件,我再来截张图。

cocos2dx使用了第三方库照样移植android平台-解决iconv库的移植问题这个是文件中的俩句话,你要和上边我说的改的那俩个地方对照起来改。好了其实就是这么简单,Android.mk文件只需要对照的改上俩个地方就可以了,程序中的那个头文件包含也要修改。现在我们就来导入到工程中构建一下工程吧。在构建的时候也会出现一个问题,我想这个问题的原因可能是因为iconv库里边实现的函数不一样吧,出现的错误的语句是这句:

1 -1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)

我们需要做如下的修改,就是在pin的前边加个强转,因为Android下函数需要传入的参数是char**,而我们程序中的pin是const char **类型的。

1 -1 == iconv(iconvH, (char **)pin, &strLength, &outbuf, &outLength)

有了以上的这些操作问题就解决了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libconv在windows系统的移植,编译,测试工程代码 确实有需要的请下载使用。以下是测试代码 #include <stdlib.h> //include <sys/ipc.h> #include <stdio.h> #include <string.h> //#include <fcntl.h> //include <unistd.h> #include <iconv.h> int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; char **pin = &inbuf; char **pout = &outbuf; size_t iconv_ret; cd = iconv_open(to_charset,from_charset); if (cd==(iconv_t)-1) { perror("iconv_open():"); exit(0); } memset(outbuf,0,outlen); iconv_ret = iconv(cd,pin,&inlen,pout,&outlen); if (iconv_ret == (size_t)-1) { perror("iconv():"); exit(0); } iconv_close(cd); return 0; } int u2g(char *inbuf,int inlen,char *outbuf,int outlen) //UNICODE码转为GB2312码 { return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); } int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) //GB2312码转为UNICODE码 { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); } /* 这是一个iconv的测试例程: “纵海杯”东南大学第三届嵌入式系统设计邀请赛 */ int main(void) { unsigned char in_utf8[] = {0x20,0xe8,0xbf,0x99,0xe6,0x98,0xaf,0xe4,0xb8,0x80,0xe4,0xb8,0xaa,0x69,0x63,0x6f, 0x6e,0x76,0xe7,0x9a,0x84,0xe6,0xb5,0x8b,0xe8,0xaf,0x95,0xe4,0xbe,0x8b,0xe7,0xa8, 0x8b,0xef,0xbc,0x9a,0x0a,0xe2,0x80,0x9c,0xe7,0xba,0xb5,0xe6,0xb5,0xb7,0xe6,0x9d, 0xaf,0xe2,0x80,0x9d,0xe4,0xb8,0x9c,0xe5,0x8d,0x97,0xe5,0xa4,0xa7,0xe5,0xad,0xa6, 0xe7,0xac,0xac,0xe4,0xb8,0x89,0xe5,0xb1,0x8a,0xe5,0xb5,0x8c,0xe5,0x85,0xa5,0xe5, 0xbc,0x8f,0xe7,0xb3,0xbb,0xe7,0xbb,0x9f,0xe8,0xae,0xbe,0xe8,0xae,0xa1,0xe9,0x82, 0x80,0xe8,0xaf,0xb7,0xe8,0xb5,0x9b,0x00}; //UTF-8编码 char in_gb2312[] =" 这是一个iconv的测试例程:\n\ “纵海杯”东南大学第三届嵌入式系统设计邀请赛"; //GB2312编码 char out[256]; int rc; printf("\r\n------iconv test------\r\n"); printf("\r\n---Start UTF8 to GB2312 convert...\r\n"); rc = u2g(in_utf8,strlen(in_utf8),out,256); printf("%s\n",out); rc = strcmp(in_gb2312,out); if(rc==0) { printf("---End UTF8 to GB2312 convert OK\r\n"); } else { printf("---End UTF8 to GB2312 convert FAIL\r\n"); } printf("\r\n---Start GB2312 to UTF8 convert...\n"); rc = g2u(in_gb2312,strlen(in_gb2312),out,256); printf("%s\n",out); rc = strcmp(in_utf8,out); if(rc==0) { printf("---End GB2312 to UTF8 convert OK\r\n"); } else { printf("---End GB2312 to UTF8 convert FAIL\r\n"); } printf("\r\n------iconv test over------\r\n"); system("pause");; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值