使用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,不过这个没啥关系了):
注意:这里是以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中,对于某些情况可能会失败。
(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中,对于某些情况可能会失败。
相关文章推荐
- 使用NDK移植/编译开源库(2)zlib的编译
- 使用NDK移植/编译开源库(3)libpng的编译
- 使用NDK移植/编译开源库(4)libjpeg的编译
- 使用NDK移植/编译开源库(5)sqlite3的编译
- 在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)
- ubuntu下使用NDK编译可执行程序的环境搭建
- Cocos2d-x 2.2.3 使用NDK配置编译环境
- ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用
- 在Wndows 上用CodeBlockes 写的代码移植到Mac OSX上,使用Xcode 编译
- Cocos2d-x 2.2.3 使用NDK配置安卓编译环境问题之 Cannot find module with tag 'CocosDenshion/android' in import path
- android开发 NDK 编译和使用静态库、动态库
- 使用 NDK r9 编译ffmpeg
- ubuntu_14.04_LTS使用NDK编译FFMPEG_2.7.2
- cocos2dx之使用Eclipse和NDK直接移植win32项目,无需cygwin
- 使用NDK编译ffmpeg
- 使用NDK移植开源项目,JNI的使用技巧
- 使用NDK r10构建Cocosd-x v3.2时编译和链接错误的解决办法
- 使用NDK编译的时候出现 undefined reference to
- 使用NDK编译的时候出现 undefined reference to
- JAVA使用jni-ndk预编译好的.so动态库