河的第三条岸 2014-11-26
在之前的文章中提到了用arm-none-linux-gnueabi-gcc交叉编译移植程序到Android平台上。也提到了,Android中没有glibc,所以arm-none-linux-gnueabi-gcc编译出来的程序需要在编译时指明连接器,并且将所需要的动态库拷贝到Android机器中。
所以为了能够更方便的使用交叉编译器移植我们所需要的程序或者库到Android平台上,我们一般采用ndk的编译方式(ndk的下载配置详见Google官方说明:http://developer.android.com/tools/sdk/ndk/index.html)
在移植的过程中,有时我们需要单独使用交叉编译工具(比如程序的依赖库的Makefile是利用configure生成,那么我们需要使用./configure CC=arm-linux-androideabi- 来生成我们所需要的Makefile)
因此,可以利用ndk生成我们需要的交叉编译工具:
在ndk的目录下运行:
./build/tools/make-standalone-toolchain.sh --platform=android-15
Auto-config: --toolchain=arm-linux-androideabi-4.6
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying libstdc++ headers and libraries...
Creating package file: /tmp/ndk-wwtao/arm-linux-androideabi-4.6.tar.bz2
Cleaning up...
Done.
--platform=android-15 是用来设定Android的API版本,其余的选项可以通过--help来查看。
这样可以得到ndk生成的交叉编译工具链。
在我们利用交叉编译工具移植了一些所需要的库之后就可以移植到Android平台上。通常来说移植过程都是差不多的,修改makefile交叉编译器,添加搜索头文件的位置和链接库的位置。如果遇到了头文件找不到的错误,常见可能性是交叉编译器的include中的头文件相对路径不一样,一般来说Google一下即可解决。
对于编译一个基于某些依赖库的程序,而这些依赖库在Android系统中已经有时,最简便的方法是找到它的头文件(有的头文件交叉便器的include中没有),然后再从Android系统中拷贝出相应的.so文件,用交叉编译器或者ndk-build编译即可。
arm-linux-androideabi-gcc -I[头文件目录] -L[动态库位置] filename.c -o filename
或者编写Android.mk文件,利用ndk-build.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := client_android
LOCAL_SRC_FILES := client.c
LOCAL_CFLAGS += -I/home/wwtao/Desktop/bluetooth/include/include
LOCAL_LDLIBS += -L/home/wwtao/Desktop/bluetooth/libfrompanda -lbluetooth
include $(BUILD_EXECUTABLE)
#include $(BUILD_STATIC_LIBRARY)
#include $(BUILD_SHARED_LIBRARY)
其中,LOCAL_PATH := $(call my-dir) 设置LOCAL_PATH为当前了路径
include $(CLEAR_VARS)是清空当前的变量
LOCAL_MODULE 是编译后生成的文件名
LOCAL_SRC_FILES 是编译的源文件
LOCAL_CFLAGS 是设置编译时的头文件搜索路径
LOCAL_LDLIBS 是设置编译时搜索动态链接库的路径
include $(BUILD_EXECUTABLE) 是生成可执行文件,如果是BUILD_STATIC_LIBRARY是生成静态库,如果是BUILD_SHARED_LIBRARY。