Android中使用Makefile编译程序和库的方法

来源:互联网 发布:网络平台招商加盟 编辑:程序博客网 时间:2024/06/06 08:27

 test为可执行程序,libtest为库。在Android中编译并运行它们方法如下,首先要下载NDK。

    参考了http://blog.csdn.net/L____J/archive/2010/08/04/5787759.aspx的方法,在此感谢。 

 

    1.  将库编译为动态库时:

     test中仅有一个文件main.c

     

[c-sharp] view plaincopy
  1. #include <stdio.h>  
  2. #include "libtest.h"  
  3. static char s_string[] = "Study hard!";  
  4. int main()  
  5. {  
  6.     printf("%s/n%d/n", s_string, ret8());  
  7.     return 0;  
  8. }  
 

     Makefile内容如下

    

[c-sharp] view plaincopy
  1. BASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4  
  2. PATH_PREFIX = $(BASE_PATH)/build/platforms/android-8/arch-arm/usr/  
  3. CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc  
  4. LD = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-ld  
  5. INCLUDES= -I $(PATH_PREFIX)/include  /  
  6.           -I/home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/  
  7. CFLAGS = -L $(PATH_PREFIX)/lib  
  8. LDFLAGS += -nostdlib -lm -lstdc++ -lc -ldl -Bdynamic -Wl,-dynamic-linker,/system/bin/linker  
  9. LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.so  
  10. EXTRA_OBJS = $(PATH_PREFIX)/lib/crtbegin_dynamic.o $(PATH_PREFIX)/lib/crtend_android.o  
  11. test: main.c  
  12.         $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^  $(EXTRA_OBJS) $(LDFLAGS)  
  13. clean:  
  14.         rm -rf test *.o  
 

     libtest中有头文件libtest.h和libtest.c

    

[c-sharp] view plaincopy
  1. #ifndef _RET_8_H_  
  2. #define _RET_8_H_  
  3. int ret8();  
  4. #endif  
 

    

[c-sharp] view plaincopy
  1. #include "libtest.h"  
  2. int ret8()  
  3. {  
  4.         return 8;  
  5. }  
 

     Makefile内容如下

    

[c-sharp] view plaincopy
  1. ASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4  
  2. PATH_PREFIX = $(BASE_PATH)/build/platforms/android-3/arch-arm/usr/  
  3. CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc  
  4. CCFLAGS = -I$(PATH_PREFIX)/include /  
  5.           -fpic /  
  6.           -mthumb-interwork /  
  7.           -ffunction-sections /  
  8.           -funwind-tables /  
  9.           -fstack-protector /  
  10.           -fno-short-enums /  
  11.           -D__ARM_ARCH_5__ /  
  12.           -D__ARM_ARCH_5T__ /  
  13.           -D__ARM_ARCH_5E__ /  
  14.           -D__ARM_ARCH_5TE__ /  
  15.           -Wno-psabi /  
  16.           -march=armv5te /  
  17.           -mtune=xscale /  
  18.           -msoft-float /  
  19.           -mthumb /  
  20.           -Os /  
  21.           -fomit-frame-pointer /  
  22.           -fno-strict-aliasing /  
  23.           -finline-limit=64 /  
  24.           -DANDROID /  
  25.           -Wa,--noexecstack /  
  26.           -O2 /  
  27.           -DNDEBUG /  
  28.           -g  /  
  29. LDFLAGS = -nostdlib -Wl,-soname,libtest.so -Wl,-shared,-Bsymbolic -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-rpath-link=$(PATH_PREFIX)lib  
  30. EXTRA_OBJS = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a $(PATH_PREFIX)/lib/libc.so $(PATH_PREFIX)/lib/libstdc++.so $(PATH_PREFIX)/lib/libm.so  
  31. libtest.so: libtest.o  
  32.         $(CC) $(LDFLAGS) $^ $(EXTRA_OBJS) -o $@  
  33. libtest.o: libtest.c  
  34.         $(CC) $(CCFLAGS) -c  $^ -o $@   
  35. clean:  
  36.         rm *.so *.o  
 

 

    启动模拟器后,在ubuntu的shell中输入

    adb push test /data/

    adb push libtest /data/

    adb shell chmod 777 /data/test

    在模拟器的shell中

    cd /data/

    export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

    ./test

 

    注意

    EXTRA_OBJS = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a

    libgcc.a需放在其它库的前面,否则程序在运行时会有无法链接的提示,但在链接时没有报错。

 

 

    2. 将库编译为静态库时

    test的Makefile此时为将

    

[c-sharp] view plaincopy
  1. LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.so  
 

    改为

    

[c-sharp] view plaincopy
  1. LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.a  
 

    即可

    libtest的Makefile此时为

    

[c-sharp] view plaincopy
  1. BASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4  
  2. PATH_PREFIX = $(BASE_PATH)/build/platforms/android-8/arch-arm/usr/  
  3. CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc  
  4. INCLUDES= -I $(PATH_PREFIX)/include  
  5. CCFLAGS = -L $(PATH_PREFIX)/lib /  
  6.          -fPIC /  
  7.          -Wall  
  8. libtest.a: libtest.o  
  9.         $(AR) -rcs $@ $^  
  10. libtest.o : libtest.c  
  11. clean:  
  12.         rm *.a  
 

    3. test的Makefile也可通过automake工具生成

    首先执行autoscan

    将生成的configure.scan重命名为configure.ac

    configure.ac内容修改如下

    

[c-sharp] view plaincopy
  1. AC_PREREQ([2.65])  
  2. AC_INIT([test], [1.0.0], [-])  
  3. AM_INIT_AUTOMAKE  
  4. AC_CONFIG_SRCDIR([test.c])  
  5. AC_CONFIG_HEADERS([config.h])  
  6. # Checks for programs.  
  7. AC_PROG_CC  
  8. # Checks for libraries.  
  9. # Checks for header files.  
  10. #AC_CHECK_HEADERS([string.h])  
  11. # Checks for typedefs, structures, and compiler characteristics.  
  12. # Checks for library functions.  
  13. AC_OUTPUT([Makefile])  
 

    Makefile.am内容如下

    

[c-sharp] view plaincopy
  1. AUTOMAKE_OPTIONS = foreign  
  2. bin_PROGRAMS = test  
  3. test_SOURCES = test.c  
 

    依次执行

    aclocal

    autoheader

    autoconf

    automake --add-missing

 

    编写脚本build.sh,内容如下

    

[c-sharp] view plaincopy
  1. CC=arm-eabi-gcc /  
  2. LD=arm-eabi-gcc /  
  3. CFLAGS="-I/home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/include" /  
  4. LDFLAGS="-L/home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib -nostdlib -lm -lstdc++ -lc -ldl -Bdynamic -Wl,-dynamic-linker,/system/bin/linker /home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o /home/apuser/Downloads/android-ndk/android-ndk-r4/build/platforms/android-8/arch-arm/usr/lib/crtend_android.o" /  
  5. ./configure /  
  6.         --build=i386-linux /  
  7.          --host=arm-elf-linux /  

    执行脚本build.sh后编译即可。

    另有Funambol的脚本,也可使用,内容如下

    

[c-sharp] view plaincopy
  1. command for C compiller:  
  2. ./configure --host=arm-eabi CC=arm-eabi-gcc CPPFLAGS="-I$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/include/" CFLAGS="-nostdlib -fno-exceptions -fno-rtti -Wno-multichar" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/" LIBS="-lc"  
  3. command for C++ compiller:  
  4. ./configure --host=arm-eabi CXX=arm-eabi-g++ CPPFLAGS="-I$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/include/ -nostdlib -fno-exceptions -fno-rtti -Wno-multichar" LDFLAGS="-Wl,-rpath-link=$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/ -L$ANDROID_ROOT/build/platforms/android-5/arch-arm/usr/lib/" LIBS="-lc"  

0 0