星期五, 十二月 20, 2013

android NDK 编译常用c开源库curl和sqlite

编译curl

1.安装msys 1.0
2.制作android独立编译工具链,这里是最新的android ndk r9b
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchina=arm-linux-androideabi-4.8 --install-dir=/d/androidgcc
这里是安装到d:\androidgcc目录下

3.下载最新curl源代码http://curl.haxx.se/download.htm

4. 进入msys 环境
5.修改PATH环境变量
   export PATH=/d/androidgcc/bin
6.进入curl源代码目录比如C:\curl-7.33.0\
     cd /c/curl-7.33.0
7.运行配置命令,告知是跨平台编译通过--host
    ./configure --host=arm-linux-androideabi   如果一切正确,最后生成标准的配置文件
8.make 开始编译,最后生成的静态库及动态库 curl-7.33.0\lib\.libs 目录下.a为静态库,.so为动态库

如果要使用静态库编译独立的可执行文件,需要在编译包含curl 函数调用的源文件加上-DCURL_STATICLIB
window下需要加入 并在最后添加如下系统库:
  d:\curl-7.33.0\libcurl.a -lws2_32 -lwldap32

Android 需要在连接生成可执行文件的时候加上 -lz
否则出现:undefined reference to 'inflateEnd'  的错误。


编译sqlite 381

同理,安装msys 1.0 和制作android 独立编译工具链同上。
1.安装msys 1.0
2.制作android独立编译工具链,这里是最新的android ndk r9b
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchina=arm-linux-androideabi-4.8 --install-dir=/d/androidgcc
这里是安装到d:\androidgcc目录下
3.下载最新sqlite 源代码:http://www.sqlite.org/download.html  Source Code 部分下载对应最新代码
  我使用的是3.8.1
  4.进入sqlite 源代码目录 cd /d/temp
  5.运行编译命令
     arm-linux-androideabi-gcc  sqlite3.c -fpic -shared -o libsqlite381.so
     得到动态库,如果想要静态库,请 加上-static 编译选项
6.测试是否成功代码,读取sqlite 版本号
   #include <stdio.h>
#include "sqlite3.h"
main()
{
printf("version is %s\n",sqlite3_libversion());
printf("sqlite3_sourceid is %s\n",sqlite3_sourceid());
}
然后编译成android 下执行文件:
arm-linux-androideabi-gcc getv.c   -o getv.android.exe    libsqlite381.so
准备传送到手机上测试:

D:\temp>adb push libsqlite381.so /sdcard/temp
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
2808 KB/s (853708 bytes in 0.296s)

D:\temp>adb push getv.android.exe /sdcard/temp
6 KB/s (6204 bytes in 1.000s)

D:\temp>adb shell
shell@maguro:/ $ su
su
root@maguro:/ # cd /system/tmp
cd /system/tmp
root@maguro:/system/tmp # cp /sdcard/temp/libsqlite381.so .
cp /sdcard/temp/libsqlite381.so .

root@maguro:/system/tmp # cp /sdcard/temp/getv.*.exe .
cp /sdcard/temp/getv.*.exe .
root@maguro:/system/tmp # chmod 755 getv.android.exe
chmod 755 getv.android.exe
root@maguro:/system/tmp # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/tmp
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/tmp
root@maguro:/system/tmp # ./getv.android.exe
./getv.android.exe
version is 3.8.1
sqlite3_sourceid is 2013-10-17 12:57:35 c78be6d786c19073b3a6730dfe3fb1be54f5657a
240|root@maguro:/system/tmp # 
all is work!perfect