怎么给android编译linux程序,Android中使用Makefile编译程序和库的方法

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

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

test中仅有一个文件main.c

#include 

#include "libtest.h"

staticchars_string[] ="Study hard!";

intmain()

{

printf("%s\n%d\n", s_string, ret8());

return0;

}

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_

intret8();

#endif

#include "libtest.h"

intret8()

{

return8;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值