libiconv是一個跨平台的提供轉碼函數的開源庫,它提供了一個轉換函數:iconv()來實現不同編碼之間的轉換,在Android平台上libxml2庫的編譯需要用到libiconv庫,所以需要編譯出libiconv庫才能夠實現libxml2的基於Android NDK的編譯,為此對libiconv庫進行了編譯分析,最終成功,並以此進行記錄。至於Android NDK平台的編譯環境搭建具體可以參考( http://www.linuxidc.com/Linux/2011-09/42646.htm )。下面就介紹如何實現libiconv庫的Android NDK環境編譯。
首先,到官網下載最新版的libiconv庫:http://ftp.gnu.org/pub/gnu/libiconv/,我編譯時為1.14版,libiconv-1.14.tar.gz,解壓該文件到linux系統中指定目錄,然後把其中的源文件全部放到jni文件中。首先在linux環境中進行配置,即首先對libiconv庫執行configure,生產linux環境下的config.h文件,因為這樣生產的config.h裡面定義了很多linux平台下的宏,安裝方法:首先,$./configure,然後$make,然後構建Android.mk文件放到jni目錄中。
Android.mk文件內容:
LOCAL_PATH:= $(call my-dir)
#libiconv.so
include $(CLEAR_VARS)
LOCAL_MODULE := libiconv
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)
#test
include $(CLEAR_VARS)
LOCAL_MODULE :=genutf8
LOCAL_SRC_FILES := tests/genutf8.c
LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/libcharset \
$(LOCAL_PATH)/lib \
$(LOCAL_PATH)/libcharset/include \
$(LOCAL_PATH)/srclib
LOCAL_SHARED_LIBRARIES := libiconv
include $(BUILD_EXECUTABLE)
執行編譯 $ndk-build
1、編譯時提示:
libiconv-1.14/jni/libcharset/lib/localcharset.c:51:24: error: langinfo.h: No such file or directory
解決方法:
修改目錄文件libcharset/config.h的宏定義,禁止該宏定義:
/* Define if you haveand nl_langinfo(CODESET). */
#define HAVE_LANGINFO_CODESET 0
2、提示錯誤:
報“c undeclaired”錯誤
解決方法:
修改文件/libcharset/lib/localcharset.c中函數get_charset_aliases (void)
搜索:int c;
把該變量定義放到該函數的開始處。
執行$ndk-build,編譯libiconv.so成功。
到目錄libs/armeabi-v7a下可以找到。
如果執行程序則需要打包到Android平台下。