Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37109
  • 博文数量: 4
  • 博客积分: 111
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-16 10:28
文章分类
文章存档

2012年(4)

我的朋友

分类: 嵌入式

2012-01-05 22:27:00

移植libxml2android系统

概述

         android系统中通过C语言处理xml文件,实现数据的交互。传统上,Androidxml的处理主要通过SAXDOM,或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,然后将山楂树博客中关于libxml2Android.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中的语句,

 

//#define HAVE_LIBZ
/* Have compression library */
//#define HAVE_LIBZ
//#define HAVE_ZLIB_H 1

    然后键入ndk-build,得到libxml/libs/armeabi/libxml2.so

 

3.编写应用测试libxml函数库

    这个例子来源于网络上的某个博客,该文件的名字为xmltest.c

 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <libxml/parser.h>
  4. #include <libxml/tree.h>

  5. int main (int argc, char **argv)
  6. {
  7.   xmlDocPtr pdoc = NULL;
  8.   xmlNodePtr proot_node = NULL,pnode = NULL,pnode1 = NULL;

  9.   pdoc = xmlNewDoc (BAD_CAST "1.0");
  10.   proot_node = xmlNewNode (NULL, BAD_CAST "root node");
  11.   xmlNewProp (proot_node, BAD_CAST "version", BAD_CAST "1.0");
  12.   xmlDocSetRootElement (pdoc, proot_node);

  13.   pnode = xmlNewNode (NULL, BAD_CAST "child node 1");
  14.   xmlNewChild (pnode, NULL, BAD_CAST "child child node 1", BAD_CAST "info");
  15.   xmlAddChild (proot_node, pnode);

  16.   pnode1 = xmlNewNode (NULL, BAD_CAST "child child node 1");
  17.   xmlAddChild (pnode, pnode1);
  18.   xmlAddChild (pnode1,xmlNewText (BAD_CAST "this will lower node, child child child node 1"));

  19.   xmlNewTextChild (proot_node, NULL, BAD_CAST "child node 2", BAD_CAST "child node 2 info");
  20.   xmlNewTextChild (proot_node, NULL, BAD_CAST "child node 3", BAD_CAST "child node info 3");

  21.   xmlSaveFormatFileEnc (argc > 1 ? argv[1]:"-", pdoc, "UTF-8", 1);

  22.   xmlFreeDoc (pdoc);
  23.   xmlCleanupParser ();
  24.   xmlMemoryDump ();
  25.   return 0;
  26. }
    将该文件放到libxml/jni目录下,并更改其Android.mk文件为:

 

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.solibiconv.so,拷贝到/system/lib/目录下,然后执行./testxml得到结果如下所示:

阅读(7339) | 评论(1) | 转发(0) |
0

上一篇:sizeof和strlen的区别

下一篇:Libc中的qsort

给主人留下些什么吧!~~

lydia_npu2013-01-17 17:13:47

能不能将你编译好的libxml2.so发我 我编译时老出现问题 不知道为啥 3Q~ 请发到邮箱403885355@qq.com