`
sharp2wing
  • 浏览: 271097 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Android NDK 下的宽字符编码转换及icu库的使用

阅读更多
原贴http://topic.csdn.net/u/20101022/16/1b2e0cec-b9d2-42ea-8d9c-4f1bb8320a54.html?r=70149216 ,看过并动手实现,记录下来以备再用。

    如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c。

    ICU4C 是IBM的国际化开发组件ICU的C语言实现版本。在android系统里也有实现。ndk里面并没有公开可用的api,需要自己加载动态库来调用转换函数。

    android下icu库路径为"/system/lib/libicuuc.so",主要用到的转换函数为ucnv_convert_?_?。这里的问号是根据版本的不同函数名也不一样。在2.2的模拟器中的libicuuc.so中此函数名为ucnv_convert_4_2,在2.1模拟器中为 ucnv_convert_3_8,貌似要根据版本不同来分开对待,还没发现可以统一的办法。

    函数原型:

    void ucnv_convert(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*);



    用法:

   //声明函数指针 
   void (*ucnv_convert)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*)=0; 
   //加载动态库 
   void* pDL = dlopen("/system/lib/libicuuc.so", RTLD_LAZY); 
   //这里以android2.2为例,函数名就是ucnv_convert_4_2 
   ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(pDL, "ucnv_convert_4_2"); 
   //加载成功就可以用了 
   if(ucnv_convert){ 
       char* cbuf = "..."; 
       char buffer[100]; 
       int errcode = 0; 
       //utf8是目标编码,ucs2是原字符编码 
        //buffer是存放转换出来的字符的缓冲,给了100字节 
        //cbuf是要转换的字符串指针 
        //errcode是错误编码,具体可网上搜索 
       ucnv_convert("utf8","ucs2", buffer, 100, cbuf, strlen(cbuf),&errcode); 
   } 

    转换成功后的字符串就放在buffer里面,如果出错了就会在errcode里面放错误代码。



    如标题所示,ndk下还有一个宽字符,也就是wchar_t的问题,跟其他平台移植也是个麻烦的事。

    linux下wchar_t默认是4个字节,而windows下(包括CE,MOBILE)和symbian下都是2个字节。解决的办法是在 android.mk文件中,找到LOCAL_CFLAGS 为其加上编译开关 -fshort-wchar(如果没有此项就手动写上),如 LOCAL_CFLAGS :=  -fshort-wchar  。这样强制编译器用2个字节处理wchar_t,不过编译时会有warning,可以不管。

    这样虽然编译器处理成2个字节,但是预编译的库libc等依然是4个字节,会导致wcslen等函数无法使用(其实ndk下wcslen本来就是废的),解决的办法可以重新编译libc,不过最简单的还是自己实现wcslen就行了。

    下面的代码是copy网上的,具体哪里的忘了,可以把wchar_t转换成char字符串,这样就可以用icu库随意转换了。

   //取得wchar_t字符串长度 
   int wlen(const wchar_t* strString){ 
       int i=0; 
       while (1) { 
           if (strString[i] == 0) { 
               break; 
           }else{ 
               i++; 
           } 
       } 
       return i; 
   } 
    
   char *W2C(const wchar_t *pw , char *pc) 
   { 
         *pc++ = *pw >> 8 ; 
         *pc = *pw ; 
         return 0 ; 
   } 
   //转换字符串 
   char *wstr2cstr(const wchar_t *pwstr, char *pcstr, size_t len) { 
       char *ptemp = pcstr; 
       if (pwstr != NULL && pcstr != NULL) { 
           size_t wstr_len = wlen(pwstr); 
           len = (len > wstr_len) ? wstr_len : len; 
           while (len-- > 0) { 
               W2C(pwstr, pcstr); 
               pwstr++; 
               pcstr += 2;  
           } 
           *pcstr = '/0'; 
           return ptemp; 
       } 
       return 0; 
   } 

    使用wstr2cstr就可以转换出来。这里还有个字节序的问题,在W2C函数里面,一个wchar_t转到char究竟是低位在前还是高位在前恐怕还是要看转换前后的编码具体对待。
分享到:
评论

相关推荐

    Android NDK使用Iconv进行编码转换

    Android NDK(Native Development Kit)提供了一种方法来实现这样的编码转换,这就是使用Iconv库。Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/...

    android ndk环境下移植libiconv方法 附源码

    本文将详细介绍如何在Android NDK环境中移植`libiconv`库,以实现跨平台的字符编码转换功能。 首先,我们来理解一下Android NDK。NDK(Native Development Kit)是Google提供的一个用于Android应用开发的工具集,...

    iconv库 android ndk可运行

    总结,iconv库在Android上的应用主要解决了跨编码问题,通过Android NDK编译生成的本地库,可以方便地集成到Java应用中,实现高效且可靠的字符编码转换功能。这对于构建全球化、本地化的应用程序尤其重要。

    Android NDK中字符串的相互转换

    在Android NDK中还没有现成的函数来处理字符串的相互转换,但是Android底层有个libicuuc.so库文件,在目录/system/lib/下可以找到这个文件。在这个文件中有个函数ucnv_convert,我们可以从这个库中找到这个函数,...

    使用Android NDK编译Android平台的eXosip库

    本文将深入探讨如何使用Android NDK(Native Development Kit)来编译适用于Android平台的eXosip库,包括静态库和动态库的构建过程。 首先,eXosip是基于OSI(Open Systems Interconnection)模型的SIP协议栈,它是...

    pcl-1.9.1 for android ndk21库

    这个"pcl-1.9.1 for android ndk21库"是专门为Android平台编译的PCL版本,它基于NDK21,这是Google发布的Android NDK的一个特定版本,提供了C和C++的交叉编译工具链,用于在Android应用中使用原生代码。NDK21支持...

    Android NDK环境配置

    Android NDK环境配置是Android应用开发中的一个重要环节,它允许开发者使用C或C++编写高性能的原生代码,这些代码可以被编译成动态库并与Java应用一同打包成APK。NDK集成了交叉编译器,使得开发者能够针对不同的CPU...

    android-ndk(android-ndk-r23b-windows.zip)

    NDK是Android应用开发中的一个重要组成部分,它允许开发者使用原生代码(如C、C++)来编写部分应用程序,从而利用底层的硬件性能,提高程序运行效率,尤其是在处理图形计算、物理模拟和游戏引擎等高性能需求的场景下...

    android-ndk(android-ndk-r25b-windows.zip)

    6. **C++支持**:NDK支持C++11及更高版本,以及一些C++标准库,如STL,这使得C++开发者能在Android平台上更好地工作。 7. **LLVM/Clang支持**:NDK引入了LLVM/Clang作为替代GCC的编译器,提供了更好的性能和更现代...

    android ndk下编译的live555源码(新版)

    4. **编译源码**:使用NDK的交叉编译功能,生成适用于Android的静态或动态库。 5. **JNI接口**:在Java层创建JNI接口,调用C++编译的库函数。 6. **运行与调试**:在模拟器或真机上运行测试,确保移植成功。 **注意...

    android使用NDK编译curl库源码

    在这个场景中,我们将探讨如何在Android环境下使用NDK(Native Development Kit)编译Curl库源码。 首先,NDK是Google提供的一个工具集,允许开发者在Android应用中集成原生代码。通过NDK,我们可以编写C和C++代码...

    android-ndk(android-ndk-r25b-linux.zip)

    在Android应用开发中,NDK扮演着至关重要的角色,它允许开发者使用原生代码(如C和C++)来编写部分应用,以提高性能、利用硬件加速功能或复用现有的C/C++库。 1. **JNI(Java Native Interface)**: JNI是Java...

    android-ndk(android-ndk-r23b-linux.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android...

    ubuntu下android ndk编译环境搭建详细描述

    通过以上步骤,你可以在Ubuntu环境下成功搭建Android NDK编译环境,开始进行原生代码的开发工作。记得保持NDK和SDK的更新,以获取最新的特性和修复。在实际开发中,可能会遇到各种问题,如库冲突、链接错误等,这时...

    androidndk开发实战

    接着,“Android NDK(r5b)环境搭建及JNI实现.docx”文件着重于JNI(Java Native Interface)的使用,这是Android应用与NDK之间通信的关键桥梁。JNI允许Java代码调用C/C++函数,反之亦然。开发者需要理解JNI的接口...

    android-ndk-r8dab.zip_NDK_android_android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具,它允许开发者使用C和C++编写部分应用代码,以利用设备的硬件性能或实现更底层的操作。在“android-ndk-r8dab....

    android-ndk(android-ndk-r26b-darwin.zip)

    NDK允许开发者在Android应用中使用原生代码,以实现高性能、低级别的硬件交互以及利用已有的C/C++库。在本案例中,我们关注的是"android-ndk-r26b-darwin.zip",这是一个专为macOS系统设计的NDK版本。 **Android ...

    android-ndk(android-ndk-r25b-darwin.zip)

    3. **库的使用**:通过NDK,开发者可以直接在Android应用中使用C/C++编写的库,这大大扩展了可利用的开源库资源,例如OpenCV、FFmpeg等。 4. **跨平台开发**:C/C++代码的跨平台性使得同一套源代码可以在多个操作...

    ECLIPSE下的androidndk开发

    集成Android NDK到Eclipse是因为Eclipse是一款广泛使用的IDE,提供了丰富的开发工具和调试功能。通过集成NDK,开发者可以在同一个环境中进行Java和C/C++代码的编写,便于项目管理,提高开发效率。 **3. 怎样操作?*...

    android ndk-stack使用说明。

    在使用Cocos2d-x、JNI及Android NDK进行开发时,经常会遇到调试困难的问题。尤其是对于C/C++代码的调试,由于涉及到本地代码与Java层之间的交互,使得调试过程变得更为复杂。为了解决这一难题,`ndk-stack`工具...

Global site tag (gtag.js) - Google Analytics