Android中使用Makefile编译程序和库的方法
Android中使用Makefile编译程序和库的方法
test为可执行程序,libtest为库。在Android中编译并运行它们方法如下,首先要下载NDK。参考了的方法。
1. 将库编译为动态库时:
test中仅有一个文件main.c
- #include <stdio.h>
- #include "libtest.h"
- static char s_string[] = "Study hard!";
- int main()
- {
- printf("%s\n%d\n", s_string, ret8());
- return 0;
- }
Makefile内容如下
- BASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4
- PATH_PREFIX = $(BASE_PATH)/build/platforms/android-8/arch-arm/usr/
- CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc
- LD = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-ld
- INCLUDES= -I $(PATH_PREFIX)/include \
- -I/home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/
- CFLAGS = -L $(PATH_PREFIX)/lib
- LDFLAGS += -nostdlib -lm -lstdc++ -lc -ldl -Bdynamic -Wl,-dynamic-linker,/system/bin/linker
- LDFLAGS += /home/apuser/Downloads/android-ndk/android-ndk-r4/libtest/libtest.so
- EXTRA_OBJS = $(PATH_PREFIX)/lib/crtbegin_dynamic.o $(PATH_PREFIX)/lib/crtend_android.o
- test: main.c
- $(CC) $(CFLAGS) $(INCLUDES) -o $@ $^ $(EXTRA_OBJS) $(LDFLAGS)
- clean:
- rm -rf test *.o
libtest中有头文件libtest.h和libtest.c
- #ifndef _RET_8_H_
- #define _RET_8_H_
- int ret8();
- #endif
- #include "libtest.h"
- int ret8()
- {
- return 8;
- }
Makefile内容如下
- ASE_PATH = /home/apuser/Downloads/android-ndk/android-ndk-r4
- PATH_PREFIX = $(BASE_PATH)/build/platforms/android-3/arch-arm/usr/
- CC = $(BASE_PATH)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc
- CCFLAGS = -I$(PATH_PREFIX)/include \
- -fpic \
- -mthumb-interwork \
- -ffunction-sections \
- -funwind-tables \
- -fstack-protector \
- -fno-short-enums \
- -D__ARM_ARCH_5__ \
- -D__ARM_ARCH_5T__ \
- -D__ARM_ARCH_5E__ \
- -D__ARM_ARCH_5TE__ \
- -Wno-psabi \
- -march=armv5te \
- -mtune=xscale \
- -msoft-float \
- -mthumb \
- -Os \
- -fomit-frame-pointer \
- -fno-strict-aliasing \
- -finline-limit=64 \
- -DANDROID \
- -Wa,--noexecstack \
- -O2 \
- -DNDEBUG \
- -g \
- 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
- 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
- libtest.so: libtest.o
- $(CC) $(LDFLAGS) $^ $(EXTRA_OBJS) -o $@
- libtest.o: libtest.c
- $(CC) $(CCFLAGS) -c $^ -o $@
- clean:
- 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需放在其它库的前面,否则程序在运��时会有无法链接的提示,但在链接时没有报错。
|
评论暂时关闭