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


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

    参考了的方法。 

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

     test中仅有一个文件main.c

  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内容如下    

  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

 
  1. #ifndef _RET_8_H_  
  2. #define _RET_8_H_   
  3. int ret8();  
  4. #endif    
 
  1. #include "libtest.h"   
  2. int ret8()   
  3. {   
  4.         return 8;   
  5. }  
 

     Makefile内容如下    

  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需放在其它库的前面,否则程序在运��时会有无法链接的提示,但在链接时没有报错。

  • 1
  • 2
  • 3
  • 下一页

相关内容