Android 不支持 C/C++ 开发? 虚拟机以上的程序是 JAVA开发,

但是底层可以用 C/C++ 跑一些 后台 程序啊, 大不了用 soket 通信嘛.

 

 计划在 rootfs  里存放一套自己的 busybox, 自己的 Bash, 自己的 command 等,

command 完全可以做成静态的, Android 里的 shell 实在太难用了。

用 Android.mk 的方式去编译 C 程序也实在是太麻烦, 打算整理出一套 其他的编译 C  程序的方法.

NDK? NDK 只是 JNI 的完善,能方便的把 so 和 java 程序打包到 apk 文件中去.

 

很多人说只能静态编译C 程序, 那是胡扯,你如果用 android 里的交叉编译工具,

用它 的环境去编译,自然可以不用静态 .

 

下面给出一套方法, 方便的用  Android 环境,编译 C/C++ 程序。

后续,我还会尝试移植各种 C 库到 Android 中去,也会分享一些 移植的经验和方法。

 

先自己做一个配置文件, 主要是  Android的编译和 链接参数:

 

cat zconfig.mk


ifdef ANDDROID
Abionic=$(A)bionic/libc/
AoutLib=$(A)out/target/product/generic/obj/lib/
CFLAGS += -I $(A)bionic/libc/arch-arm/include -I $(A)bionic/libc/include -I $(A)bionic/libc/kernel/common -I $(A)bionic/libc/kernel/arch-arm -c -fno-exceptions -Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables /
 -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ /
 -include $(A)system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG /
 -O2 -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop /
 -frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64  -MD

LIBS +=-nostdlib -Bdynamic -Wl,-T,$(A)build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc

LIBS +=-L$(AoutLib) -Wl,-rpath-link=$(AoutLib) -lc -lm  $(AoutLib)crtbegin_dynamic.o -Wl,--no-undefined $(A)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a $(AoutLib)crtend_android.o
endif

接下来是一个通用的 Makefile, 这个 Makefile 中需要包含 zconfig.mk

cat Makefile

 

ifdef TARGET
include zconfig.mk
CROSS=$(CROSS_COMPILER)-
CC=$(CROSS)gcc
AR=$(CROSS)ar
LD=$(CROSS)ld
else
CC = gcc
AR = ar
LD = ld
STRIP = strip
endif

INCLUDE+= -I../ -I./

OBJ_DIR = obj/
OBJECTS = $(OBJ_DIR)hello.o
TARGET_OUTPUT=./hello

CFLAGS +=
all: $(TARGET_OUTPUT) $(TEST_OUTPUT) $(OBJECTS)

$(OBJ_DIR)%.o: %.c
        @-mkdir -p $(OBJ_DIR)
        $(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@

$(TARGET_OUTPUT): $(OBJECTS)
        $(CC) $(LIBS) -o $(TARGET_OUTPUT) $(OBJECTS) $(LD_PATH) $(LIBOBJECTS)
        @echo "make $@ finished on `date`"
clean:
        @rm -f $(TARGET_OUTPUT)
        @rm -rf obj

 

然后是一个  hello.c

#include

int main()
{
        printf("hello world /n");
        return 0;
}

 

 

自己的编译环境变量:

cat setenv.sh

 

export PATH=$PATH:/android/myandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
export CROSS_COMPILER=arm-eabi
export TARGET=1
export ANDDROID=1
export A=/android/mydroid/

 

 

在 编译 helloworld 以前, 请确认,你已经编译过 android  源代码,

确认 out 目录下有相应的库和工具。

这套机制十分灵活,你可以轻松的编译 X86  版, ARM LINUX 版, Android 版。

 

最后执行

make

 

 

编译成功以后, 用 adb push 把程序放到 虚拟机里。

如果要编译动态库,则有有点小小的差异, 接下来会介绍。

 

 

 

更多相关文章

  1. Android应用程序签名(官方文档中文版)(上)
  2. 博文视点大讲堂 37 期——It's Android Time :程序员创富有道!圆满
  3. Android 应用程序窗体显示状态操作(requestWindowFeature()的应用
  4. ubuntu下eclipse Android ADT中SDK Manager中安装SDK失败的方法
  5. android平台下基于cmake编译链接ffmpeg-3.4.x的32位和64位(armea
  6. [置顶] Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法
  7. Android异步加载图像小结(含线程池,缓存方法)[转]
  8. TextView支持的XML属性及相关方法

随机推荐

  1. Android(安卓)动画之帧动画
  2. android背景模糊化处理
  3. Android图像处理之冰冻效果
  4. Android Material Design 之 Coordinator
  5. android之GridView和Gallery
  6. Android: Multithreading For Performanc
  7. Android设计原则及规范指南!UI设计师值得
  8. Android 广播监听USB插拔
  9. Android Custom UI: Making a Vintage Th
  10. inotify in android