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平台下基于cmake编译链接ffmpeg-3.4.x的32位和64位(armea
  2. 3D激光扫描三维重建——6.(android)系统框架
  3. eclipse新建android工程出现This template depends on Android(
  4. Android下生成core dump的方法
  5. Android画图之抗锯齿
  6. 如何调用Android隐藏API
  7. Android(安卓)AsyncTask基础
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. c语言程序是从源文件第一条语句开始执行
  2. c语言中形参的默认存储类型是什么?
  3. c语言和vb哪个简单
  4. c语言数据类型转换的方法
  5. c语言中“或”怎么表示?
  6. c语言怎么实现动态内存分配
  7. c语言二进制如何表示
  8. c语言中的关键字有哪些类型?
  9. c语言中long是什么意思
  10. c语言0x什么意思