cocos2d-x android 编译 iconv库

时间:2022-03-07 23:51:35

参考文章: http://momowing.diandian.com/post/2013-01-16/40047183777
不过我要做点修改,把函数改掉,因为到android中会报错,如下:
conversion from 'char const**' to 'char**' [-fpermissive]。。。。。。。。。。。。。。。。
这个解决方法:
       把有const删了,即可。
我还是具体讲讲 在android上编译iconv吧:


一: 新建一个android项目,并且导入eclipse中(应该都知道);


二: 去网上下载个iconv的库文件:https://dl.dropbox.com/u/99895284/iconv.zip解压,并且得到iconv文件夹,把该文件夹放入cocos2d-x的文件夹下:如图

cocos2d-x android 编译 iconv库

三: 修改新建的android项目中的jni/Android.mk文件,如图:

cocos2d-x android 编译 iconv库

//其中 编译的Tools是我新建的类,用于编码转换,也就是用到iconv的一个类。


四: 为了以后编译更加简单,我还把iconv这个文件夹复制到ndk目录下的source文件夹:如图
cocos2d-x android 编译 iconv库
为什么我放到这里,可以参考我的一篇博客: http://blog.csdn.net/cwn0812/article/details/10741275


五: 配置项目属性:
1): Builders -> new -> Program
2): Main -> Location -> Browse File System -> 选择NDK路径下的 ndk-build.cmd文件,确认
  Main -> Working Directory -> Browse Workspace -> 选择你的项目,确认
3): Refresh -> 打钩Refresh resources upon completion -> 选择Specific resources -> 选择项目的jni文件夹,确定
4): 跳过Environment ,因为我把要编译的文件夹都放到了ndk目录的resource文件夹下了
5): Build Options -> 打钩during a “Clean” ,和Specify working ... 并且选中选择项目的jni文件夹确定,
具体参考上面说的博客,里面有图。


六: 完成。clean 下项目。如图:
cocos2d-x android 编译 iconv库


七:我封装的类Tools (参考他们写的类,做些修改)

Tools.cpp
int Tools::code_convert( char *from_charset, char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen )
{
	iconv_t cd;
	char *temp = inbuf;
	char **pin = &temp;
	char **pout = &outbuf;
	memset(outbuf,0,outlen);
	cd = iconv_open(to_charset,from_charset);
	if(cd==0) return -1;
	if(iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
	iconv_close(cd);
	return 0;
}

std::string Tools::u2a( const char *_inbuf )
{
	char *inbuf = new char[strlen(_inbuf)+1];
	strcpy(inbuf, _inbuf);

	size_t inlen = strlen(inbuf);
	char * outbuf = new char[inlen * 2 + 2];
	string strRet;
	if(code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
	{
		strRet = outbuf;
	}

	delete [] inbuf;
	delete [] outbuf;
	return strRet;
}

std::string Tools::a2u( const char *_inbuf )
{
	char *inbuf = new char[strlen(_inbuf)+1];
	strcpy(inbuf, _inbuf);

	size_t inlen = strlen(inbuf);
	char * outbuf = new char[inlen * 2 + 2];
	string strRet;
	if(code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, inlen * 2 + 2) == 0)
	{
		strRet = outbuf;
	}

	delete [] outbuf;
	delete [] inbuf;
	return strRet;
}

在HelloWorldScene.cpp中调用
std::string str = Tools::a2u("中文 哈哈wuliao");

		CCLabelTTF* label = CCLabelTTF::create(str.c_str(),"Arial",27);
		label->setPosition(ccp(size.width/2,size.height/2));
		this->addChild(label);

运行到真机,测试成功啦。