您的位置:首页 > 其它

使用NDK移植/编译开源库(1)准备

2011-11-27 01:00 344 查看
现在NDK版本已经r7了,在以前的使用NDK编译过几个开源库,发现时间久了,有些东西已经开发忘记了,所以重新编译一下这几个库,并记录一下,防止万一哪天还想编译别的库,也可以用来做一个参考。PS:尽管现在Android上一般还不至于完全使用NDK开发,但是,NDK或许还是有一定的发展空间的,谁知道呢。

(1)安装NDK

不多说,使用NDK工具链编译,当然要安装NDK这个交叉环境。

(2)了解NDK的gcc

安装完NDK后,用其gcc编译一个"hello, world“就可以了。如下(工作环境:Ubuntu,不过这个没啥关系了):

#echo $NDK
/opt/android-ndk-r7
#ls
helloworld.c
#export SYSROOT=$NDK/platforms/android-14/arch-arm
#export CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
#$CC --version
arm-linux-androideabi-gcc (GCC) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#cat helloworld.c
#include <stdio.h>
int main(int argc, char* argv[]) {printf("hello world!\n");}
#$CC helloworld.c
#./a.out
bash: ./a.out: cannot execute binary file
#
其实,就是设置CC为android NDK提供的gcc,--sysroot指定相关的系统文件(头文件库文件)的位置,最后可执行文件无法执行是正常的,这里编译的是arm上的可执行文件。可以将此a.out复制到android上去运行,在android的命令行下是可以运行的(可能会需要root权限),我是使用SDK的adb shell命令行运行的,但是在模拟器的命令行没法运行,这是权限问题,这里就不探讨了,本来,也不会真去写android上的可执行文件。)

注意:这里是以CC为例了解了android的GCC环境,在编译有些库的时候,如果可能,或许会指定CXX等相关的编译器、链接器等。

(3)基本思路

用NDK编译开源库的木的是得到.so文件,从而给JNI去调用。就我目前所知,两种思路去编译:

1. 使用类似于编译自己写的NDK程序一样,使用ndk-build,书写android.mk文件来编译。这种方法,说白了,关键在于写android.mk了,对于工程复杂,目录复杂的源码,写android.mk太费力,所以这种方法,很少用,下面的内容中,我会在少数简单的库的编译的时候提供这种方法。

2. 直接用上面的GCC环境,利用开源库自己的configure/makefile去编译。这个,其实就比较容易理解了,和一般的交叉移植没太多区别,下面的内容就以具体的例子来记录几个开源库的编译,毕竟,移植的关键是可能遇到问题,然后要修改少量代码。至于更多的库的移植,以后如果还有兴趣,就再补充记录!

说明:这是一篇旧文,对于直接使用gcc进行相关库的移植,更好的方法是先生成一个独立的工具链。NDK中有一个脚本大概叫make standalone toolchain的脚本,运行一下生成一个独立的工具链,然后设置CC(不需要设置sysroot),这样的方法会比较好。直接指定CC到当前NDK中,对于某些情况可能会失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: