编写ios和android共用的c/c++库时 使用iconv的问题

在iOS和Android项目中,为了统一通信代码,作者使用C/C++库进行GBK到UTF-8的转码。遇到的问题包括iOS编译.a静态库时缺少libiconv符号,解决方法是添加libiconv.2.4.0.tbd动态库。而在Android端,编译.so库时找不到iconv.h头文件,尝试多种解决办法未果,最终发现Android NDK自带iconv功能,但需要在不使用android.mk的情况下引入。
摘要由CSDN通过智能技术生成

因为在项目中需要同时维护ios和android,不同的代码不利于开发的便捷和以后的维护,所以在最近的一个项目中,两种手机应用的通信部分打算使用c/c++库来统一编写,ios调用.a静态库,android调用.so动态库的方式来实现。

由于通信时,从服务端获取到的中文数据为GBK编码,android和ios通过c++库获取到的中文乱码,于是打算在c++库层统一将GBK转成UTF-8后再传递给上层应用。

由于优先考虑跨平台的方案,最终我采用iconv库来实现转码功能。参考网上搜到的一个代码如下

#ifndef STRINGUTIL_H_
#define STRINGUTIL_H_

#include <cstring>
#include <iconv.h>

#ifdef _WIN32
#pragma comment(lib,"iconv.lib")
#endif

int code_convert(const char *from_charset,const char *to_charset,const char *inbuf,size_t inlen,char *outbuf,size_t outlen) {
 iconv_t cd;
 const char **pin = &inbuf;
 char **pout = &outbuf;

 cd = iconv_open(to_charset,from_charset);
 if (cd==0) return -1;
 memset(outbuf,0,outlen);
 iconv(cd, const_cast<char**>(pin), &inlen,pout, &outlen);
 iconv_close(cd);
 return 0;
}

/* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
 return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}

/* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
 return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}

#endif /* STRINGUTIL_H_ */
</span>

代码用g++编译,在ubuntu上测试正常,但在移植到ios和android均出现问题。

1.首先讲ios上出现的问题,这个比较简单。

使用xcode能够成功编译出.a静态库,但是在ios应用编译时,出现如下问题:

Undefined symbols for architecture x86_64:

  "_iconv", referenced from:

      code_convert(char const*, char const*, char const*, unsigned long, char*, unsigned long) in libVmNet.a(VmNet-EA133239D29A369D.o)

  "_iconv_close", referenced from:

      code_convert

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值