2012年(4)
分类: 嵌入式
2012-01-05 22:27:00
概述
在android系统中通过C语言处理xml文件,实现数据的交互。传统上,Android对xml的处理主要通过SAX,DOM,或pull解析器处理XML文件,而他们主要是面向Java语言的。而本文主要叙述如何为C语言提供xml的函数库的支持。
Libxml2主要是面向C/C++的一个强大的XML解析库,将该库移植到android中,可有效解决通过C语言实现XML文件的处理。
Libxml2函数库依赖于libiconv函数库,故需要将他们依次通过ndk方式编译成动态库,将他们拷贝到android系统的/system/lib目录下,使得编写的C应用程序能够成功连接到这些函数库。
1.利用Android NDK编译libiconv库
这是参考山楂树博客的做法实现的,我这里编译的版本是libiconv-1.14。
将这个步骤的jni目录和libs/armeabi/libiconv.so文件拷出,以备第二步使用。
2.通过Android NDK编译libxml2库
这个也是参考山楂树的博客,不过按它的编译步骤出了一些bug,所以这里会补充一些内容。
首先下载libxml2
从 处下载libxml2-2.7.2.tar.gz软件包,然后创建目录libxml,将压缩包解压缩到该目录下,并重命名解压出的文件名为jni。
然后执行./configure,然后将山楂树博客中关于libxml2的Android.mk稍作更改并保存到libxml/jni目录下,如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
c14n.c catalog.c chvalid.c debugXML.c dict.c DOCBparser.c \
encoding.c entities.c error.c globals.c hash.c HTMLparser.c \
HTMLtree.c legacy.c list.c nanoftp.c nanohttp.c parser.c \
parserInternals.c pattern.c relaxng.c SAX.c SAX2.c \
threads.c tree.c trionan.c triostr.c uri.c valid.c\
xinclude.c xlink.c xmlIO.c xmlmemory.c xmlmodule.c \
xmlreader.c xmlregexp.c xmlsave.c xmlschemas.c xmlschemastypes.c xmlstring.c \
xmlunicode.c xmlwriter.c xpath.c xpointer.c
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/include/libxml \
$(LOCAL_PATH)/../libiconv/include \
$(LOCAL_PATH)/../libiconv \
$(LOCAL_PATH)/../libiconv/libcharset \
$(LOCAL_PATH)/../libiconv/lib \
$(LOCAL_PATH)/../libiconv/libcharset/include
LOCAL_MODULE:=libxml2
LOCAL_SHARED_LIBRARIES :=libiconv
include $(BUILD_SHARED_LIBRARY)
将第一步编译的jni目录重命名为libiconv,并保存到libxml目录下。将libiconv.so文件拷贝到libiconv/obj/local/armeabi目录下,如果没有该目录,那么新建一个。并修改libxm/jni/threads.c的开头添加如下语句:
#define LIBXML_THREAD_ENABLED
注释libiconv/jni/config.h中的语句,
然后键入ndk-build,得到libxml/libs/armeabi/libxml2.so
3.编写应用测试libxml函数库
这个例子来源于网络上的某个博客,该文件的名字为xmltest.c。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testxml
LOCAL_SRC_FILES := xmltest.c
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/include/libxml \
$(LOCAL_PATH)/../libiconv/include \
$(LOCAL_PATH)/../libiconv \
$(LOCAL_PATH)/../libiconv/libcharset \
$(LOCAL_PATH)/../libiconv/lib \
$(LOCAL_PATH)/../libiconv/libcharset/include
LOCAL_SHARED_LIBRARIES := libxml2 libiconv
include $(BUILD_EXECUTABLE)
然后执行ndk-build
4.将生成的库拷贝到android系统
将之前生成的libxml2.so,libiconv.so,拷贝到/system/lib/目录下,然后执行./testxml得到结果如下所示: