场景

    NDK环境下使用sqlite3存储用户数据,存储的是UTF-8格式,读取数据库,转换为GBK显示中文。测试结果表明:Android自带的iconv库不支持GBK转码,也不支持GBK2312的转码

测试步骤如下

使用Android自带的iconv库,引入该库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := mylib.cpp
LOCAL_WHOLE_STATIC_LIBRARIES += android_support
LOCAL_CXXFLAGS += -std=c++11 -fexceptions
include $(BUILD_SHARED_LIBRARY)
$(call import-module, android/support)
红色的字体是需要添加的代码
代码段:
  errno = 0;
  iconv_t cd = iconv_open("GBK", "UTF-8");
  if (errno !=0)
  {
    LOGE("test", "err:%s", strerror(errno));
  }
使用Android自带的iconv函数,出现如下的错误:errno:22  errinfo:Invalid argument
其中大小写,还有GB2312等尝试转换,还是出现上面的问题,核心原因是Android自带的库不支持GBK的编码转换,

解决

使用GNU的iconv编译作为NDK使用,最终解决问题,建立的iconv库的mk文件如下:
LOCAL_PATH:= $(call my-dir)
#libiconv.so
include $(CLEAR_VARS)
 
LOCAL_MODULE := libueiconv
LOCAL_CFLAGS := \
  -Wno-multichar \
  -DAndroid \
  -DLIBDIR="c" \
  -DBUILDING_LIBICONV \
  -DIN_LIBRARY
LOCAL_SRC_FILES := \
  libcharset/lib/localcharset.c \
  lib/iconv.c \
  lib/relocatable.c
LOCAL_C_INCLUDES += \
  $(LOCAL_PATH)/include \
  $(LOCAL_PATH)/libcharset \
  $(LOCAL_PATH)/lib \
  $(LOCAL_PATH)/libcharset/include \
  $(LOCAL_PATH)/srclib
include $(BUILD_SHARED_LIBRARY)