基于NDK下的编码转换,当然是直接调用C/C++下的实现效率更高,下面介绍2种方案(不建议通过JNI调用JAVA的实现,尽管这样也能实现编码的转换)。

1. 采用Android系统自带的libicuuc.so库,此库的源代码在/home/george/source/rk3168_v4.2/external/icu4c/common下

2. 采用第三方编码转换库libiconv,源码链接:http://ftp.gnu.org/pub/gnu/libiconv/

libiconv的使用有3个函数:

a) iconv_t iconv_open (const char* tocode, const char* fromcode);

b) size_t iconv (iconv_t cd, const char* * inbuf , size_t * inbytesleft, char* * outbuf , size_t * outbytesleft);

inbytesleft:inbuf的字符串长度;

outbytesleft:输入为outbuf所指向的缓冲区长度,输出为剩余没用到的缓冲区长度;因此转换后的字符串长度为(outbuflen - outbytesleft);

inbuf, outbuf:返回时指针都后移了,需要注意。

c) int iconv_close (iconv_t cd);

这里采用Android系统自带的库进行编码转换,当然也可采用第三方支持。以下贴出代码段

(gbk和Unicode的互转因为没有用到,所以未贴出,但我想你应该要会了吧):

#include "libcnv.h"

/* use dl API include file */

#include

/* typedef a function pointer to pointer ucnv_convert method */

/*

see the source code define

int32_t ucnv_convert(const char *toConverterName, const char *fromConverterName,

char *target, int32_t targetSize,

const char *source, int32_t sourceSize,

int32_t * err)

*/

typedef int32_t (*TUCNVCONVERT)(const char *lpcOutEcd, const char *lpcInEcd,

char* lpOutBuf, int32_t nOutBufLen,

const char* lpcInStr, int32_t nInStrLen,

int32_t *pnErrCode);

/* pointer libicuuc.so dl lib */

static void* g_lpdlIcuuc = 0;

/* ucnv_convert method pointer */

static TUCNVCONVERT g_lpfnUcnvConvert = 0;

//在libicuuc.so中找到函数ucnv_convert

int dl_icuuc_init()

{

g_lpfnUcnvConvert = 0;

g_lpdlIcuuc = dlopen("/system/lib/libicuuc.so", RTLD_LAZY);

if (g_lpdlIcuuc != 0)

{

int i, j;

char szDLFnName[32]={0};

i = 3;

j = 8;

//android2.1, ucnv_convert_3_8

//android2.2, ucnv_convert_4_2

//android2.3, ucnv_convert_44

//android4.0, ucnv_convert_46

//android4.0, ucnv_convert_46

//android4.1, ucnv_convert_47

//android4.2, ucnv_convert_48

//android4.3, ucnv_convert_50

//android4.4, ucnv_convert_51

//其尾椎在,在源码的common/unicode/uvernum.h:77:  #define U_ICU_VERSION_SUFFIX _48

g_lpfnUcnvConvert = (TUCNVCONVERT)dlsym(g_lpdlIcuuc, "ucnv_convert_3_8");   while (0 == g_lpfnUcnvConvert)   {    memset(szDLFnName, 0, 32*sizeof(char));    sprintf(szDLFnName, "ucnv_convert_%d%d", i, j);    g_lpfnUcnvConvert = (TUCNVCONVERT)dlsym(g_lpdlIcuuc, szDLFnName);    if (g_lpfnUcnvConvert != 0){     return 1;    }    sprintf(szDLFnName, "ucnv_convert_%d_%d", i, j);    g_lpfnUcnvConvert = (TUCNVCONVERT)dlsym(g_lpdlIcuuc, szDLFnName);    if (g_lpfnUcnvConvert != 0){     return 1;    }    j++;    if (j > 9){     j = 1;     i++;     if (i > 5){      break;     }    }   }  }  return 0; } int dl_icuuc_uninit() {  if (g_lpdlIcuuc != 0)  {   dlclose(g_lpdlIcuuc);   g_lpdlIcuuc = 0;  }  return 1; } //utf-8,gb2312,ucs4 //utf-8:  一个英文字母或者是数字占用一个字节,汉字占3个字节 //gb2312: 一个英文字母或者是数字占用一个字节,汉字占2个字节 int32_t dl_icuuc_gbk2utf8(char *outbuf, int32_t buflen, const char *instring, int32_t inlen) {  int32_t iret;  iret = 0;  if (outbuf != 0 && instring != 0)  {   if (g_lpfnUcnvConvert != 0)   {    int32_t err_code = 0;    iret = g_lpfnUcnvConvert("utf-8", "gb2312"       ,outbuf, buflen       ,instring, inlen       ,&err_code);   }  }  return iret; } int32_t dl_icuuc_utf82gbk(char *outbuf, int32_t buflen, const char *instring, int32_t inlen) {  int32_t iret;  iret = 0;  if (outbuf != 0 && instring != 0)  {   if (g_lpfnUcnvConvert != 0)   {    int32_t err_code = 0;    iret = g_lpfnUcnvConvert("gb2312", "utf-8"       ,outbuf, buflen       ,instring, inlen       ,&err_code);   }  }  return iret; } int32_t dl_icuuc_unicode2utf8(char *outbuf, int32_t buflen, const unsigned short *instring, int32_t inlen) {  int32_t iret;  iret = 0;  if (outbuf != 0 && instring != 0)  {   if (g_lpfnUcnvConvert != 0)   {    int32_t err_code = 0;    iret = g_lpfnUcnvConvert("utf-8", "ucs4"       ,outbuf, buflen       ,(const char *)instring, inlen*sizeof(unsigned short)/sizeof(char)       ,&err_code);   }  }  return iret; } int32_t dl_icuuc_utf82unicode(unsigned short *outbuf, int32_t buflen, const char *instring, int32_t inlen) {  int32_t iret;  iret = 0;  if (outbuf != 0 && instring != 0)  {   if (g_lpfnUcnvConvert != 0)   {    int32_t err_code = 0;    iret = g_lpfnUcnvConvert("ucs4", "utf-8"       ,(char *)outbuf, buflen*sizeof(unsigned short)/sizeof(char)       ,instring, inlen       ,&err_code);   }  }  return iret; }

android jni gbk,Android之NDK编码转(UTF8-GBK)相关推荐

  1. android jni总结,Android JNI总结.doc

    Android JNI总结 JNI总结 JNI有多重实现方式,一下会详细讲解多种方式: 1 应用级 用eclipse构建一个应用程序,JNITest1. Xml代码 < ?xml version ...

  2. 中文字符串的编码转换 UTF-8//GBK

    golang在处理中文时默认的是utf-8编码,当某些情况下遇到GBK编码或需要GBK编码时,就会出现显示乱码的问题. 1. simplifiedchinese golang官方有针对中文编码转换的包 ...

  3. android jni 调用java_Android 基于NDK的JNI开发 C调用java和java调用C

    首先,这里所要讲的主要是C调用java的,因为这里网上也没有一个详细的资料,其次,我开发android应用没多久,其中java错误敬请谅解! 关于配置NDK环境问题应该不用再赘述了,这个网上有很多,只 ...

  4. android jni release,Android NDK 设置编译模式debug和release

    原文:http://stackoverflow.com/questions/14564918/android-ndk-release-build Unless you have created the ...

  5. android jni skia,Android NDK 调用Skia进行底层绘图

    Skia是Android的底层的图形库,最近看了一下参考了了网上的例子最初是这样做的就是从上层直接传一个Canvas再在底层获取它 运行的时候老是不成功,不过可以画图形,比如线.矩形等,最后在网上查了 ...

  6. android jni语法,Android NDK中的JNIEXPORT和JNICALL

    基本上是一个Windows问题,如果你看看oracle Java jdk附带的文件jni_md_win32.h这是宏定义: /* * @(#)jni_md.h 1.14 03/12/19 * * Co ...

  7. android jni framework,Android Framework层的JNI机制(二)

    Java框架层中有很多地方使用JNI机制,每一个部分的框架层代码,都可能有与之对应的JNI库.先了解Java框架层的组成,继续看一下JNI在框架层中的使用. Java框架层的组成 Java框架层的实体 ...

  8. android jni bitmap,android – 如何使用JNI位图操作来帮助避免...

    注意:这是一个有点旧的代码.对于最新的,请查看github上的项目页面. JNI / Android.mk LOCAL_PATH := $(call my-dir) #bitmap operation ...

  9. Android JNI for Android Studio 2.2 or higher

    点击浏览 官网说明 (要翻墙) 安装插件 需要打开SDK Manager 菜单栏 Tools>Android>SDK Manager 点击切换到 SDK Tools 选项卡 勾选 LLDB ...

  10. android jni 多线程,[Android]JNI进阶--线程池

    当一些异步的任务的时候,使用C++来创建线程来做任务的时候, 可以引用std::thread这个库 使用方法如下,创建一个线程,里面通过std::bind来绑定方法任务. std::thread th ...

最新文章

  1. 我从阿里面试回来,想和Java程序猿谈一谈
  2. Linux下l2tp客户端xl2tpd的安装配置
  3. Matlab 条形图实例
  4. 翻译:A DSL in 5 Languages(五种语言的DSL)
  5. Java PrintWriter close()方法与示例
  6. html乱码框框,springmvc+font-awesome开发出的页面显示方框乱码的解决方法
  7. 解决python访问中突发requests.exceptions.ConnectionError:Max retries exceeded with url报错
  8. 【视频专访】他用3年时间,从0开始打造专属大学生的IT教育品牌,只为将他们送入国内最顶尖IT名企。...
  9. 数字逻辑电路课程设计之数字电子时钟
  10. VMware 8.0下载地址
  11. phpcms v9 wap手机门户分页(显示首页末页)
  12. 细说ConcurrentHashMap扩容规则
  13. c语言大刀符号程序,特殊符号大刀图案 | 手游网游页游攻略大全
  14. 大一高数下册笔记整理_大学高等数学知识点整理(全)
  15. Pyinstaller的Spec文件用法
  16. [BUGKU] [PWN] PWN5
  17. 安装TDM-GCC时一直报错,大佬求解
  18. linux下需要将nas盘挂
  19. 百度的链接打不开解决办法
  20. 百度网盘安装在c盘显示系统权限限制的解决方法

热门文章

  1. 2021年11月 网络工程师上午真题及答案
  2. 吃掉脂肪,狂减33斤!午餐菜单一次性公开!
  3. 网站服务器不使用虚拟内存,服务器不设置虚拟内存
  4. es查询所欲_ElasticSearch 查询所有数据
  5. boss直聘一句话介绍优势_BOSS直聘,综艺混战中的“技术流”
  6. 第1章 HTML5基础 课后作业
  7. 【教训】徐小平:不要用兄弟情谊来追求共同利益,要用共同利益追求兄弟情谊...
  8. JavaScript初级部分总结
  9. SIMPLE_DEV_PM_OPS宏
  10. mysql sql 除法函数_SQL如何做除法