转自:http://www.linuxidc.com/Linux/2010-08/27880.htm

严格意义上来讲,Google Android 平台只支持基于 Android Dalvik VM 的 Java 语言开发,当前的 Android 对C/C++开发的支持仅限于用C/C++开发动态链接库,然后在Java中以JNI的形式来调用,换句话说,仅仅依靠C/C++在Android平台上进行应用的开发,当前还无法实现。这对于广大在Symbian和Windows Phone平台上使用C/C++进行手机应用开发的开发者来说并不是一个好消息。对于Android本身来说,也有不利的地方,它将大量的C/C++开发主力军挡在了Android平台的门外,不利于Android的繁荣发展。

当然,作为一个被广泛装载的智能手机操作系统平台,平台本身对开发的多样性的支持将是一种趋势,类似于占市场主导地位的Symbian支持C++,Java开发。

随着Android NDK的推出,我们也看到了Google 对Android平台下支持C/C++开发所进行的努力,由此,Android平台的C/C++开发也进入了正规军的行列,虽然还不是主力军。尽管当前Google推出了有助于C/C++开发的NDK,但是当前版本的NDK功能上还有很多局限性:NDK并没有提供对应用程序生命周期的维护;NDK也不提供对Android系统中大量系统事件的支持;对于作为应用程序交互接口的UI API,当前版本的NDK中也没有提供,由此可见,NDK只是Google对Android平台上C/C++开发的一个初步的支持,我们期待Google可以做得更多更好。

Android 平台整体架构分为4层,分别为:

Applications:                                                      应用程序层

Application Framework:                           应用程序框架层

Library && Android Runtime:               底层功能库以及Android运行时

Linux Kernel:                                                     Linux 内核

Android 整体架构图如下:

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 <stdio.h>

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 把程序放到 虚拟机里。

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

标准的做法是 把 src 放到  /Android/develop/ 目录下去,然后建立 Android.mk 文件,

然后 make modue ...., 但是,这种方式 太麻烦。

下面介绍一种方法,可以比较快速的编译 C 库,

和上一篇中一样,首先要设置自己的环境变量:

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/

然后依然是建立一个 mk 文件:

cat zconfiglib.mk

ifdef ANDDROID
Abionic=$(A)bionic/libc/
AoutLib=$(A)out/target/product/teton_ebook/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 -Wl,-soname, -Wl,-T,$(A)build/core/armelf.xsc -Wl,--gc-sections -Wl,-Bsymbolic -L$(AoutLib) -Wl,--whole-archive   -Wl,--no-whole-archive -lc  -lm -Wl,--no-undefined   $(A)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a

然后是你自己的 lib 的 makefile.

cat makefile

ifdef TARGET
include /zconfiglib.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./

LIBS+= -shared

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

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) 
        @echo "make $@ finished on `date`"
clean:
        @rm -f $(TARGET_OUTPUT)
        @rm -rf obj

然后  make 就可以了。

编译出来的库貌似需要放到  /system/lib 下去。

Android C/C++ 开发相关推荐

  1. android sdk软件开发套件,ANDROIDSDK-SITARA

    TI 的 Android 开发套件是一套完整的软件,Sitara 器件的开发人员可以用其轻松快速地评估 Android 操作系统.该套件提供稳定且经全面测试的软件基础,可广泛用于包括评估模块和 Bea ...

  2. 树莓派Android Things物联网开发:创建一个Things项目

    [转载请注明出处:http://blog.csdn.net/leytton/article/details/77854144] <树莓派Android Things物联网开发>系列文章专栏 ...

  3. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  4. 【Android】Parse开发笔记(1)—— 准备

    一.简介 Parse是由 YC 孵化出来的.专为移动应用提供后台服务的云计算平台,为开发者包办繁琐的后台服务,让开发者只需专注于具体的开发工作.它提供任意数据保存.照片或其它文件存储.发送推送通知.创 ...

  5. Android短视频开发都需要什么技术?

    今天我们来讲点干货,估计来看这篇帖子的人都知道短视频APP有多火,也都知道安卓系统在手机系统中占的市场份额有多大,那我就不多嘴巴拉巴拉一些行业背景了,以下我着重讲一讲Android端的短视频开发技术. ...

  6. Android Studio ndk-Jni开发详细

    2019独角兽企业重金招聘Python工程师标准>>> Android Studio ndk-Jni开发详细入门,Aes加密demo 字数920 阅读13 评论0 喜欢0 Java ...

  7. android的UI开发工程师指引

    不管是MFC,还是linux,还是android,UI开发都是如下两大核心机制: 第一个是消息循环,第二个是界面组织结构. 围绕着这些,衍生出来的OpenGL,SurfaceView,SurfaceF ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. android 编写系统应用,Android应用快速开发系统设计与实现

    摘要: 自Android系统诞生以来,传统的手持电话遭受了巨大冲击,智能手机的功能越来越强大,价格也越来越低廉,智能手机开始出现在越来越多的普通用户手中.到现在为止,Android手机已经在智能手机领 ...

  10. android应用程序开发_Kotlin与Flutter:Android跨平台应用程序开发,到底选择哪个?...

    移动互联时代--应用为王 移动互联网时代,很难想象没有应用程序的生活.从我们睁眼醒来的那一刻到我们真正睡觉的那一刻,无数的应用程序围绕着我们.根据统计,国人平均在移动设备上花费4个小时以上! 而这其中 ...

最新文章

  1. 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)
  2. python并发编程:阻塞IO
  3. mysql 内存占用过多的解决方法
  4. leetcode - 101. 对称二叉树
  5. python运维开发笔记5
  6. 应用FileInputStream类,编写应用程序,从磁盘上读取一个Java程序,并将源程序代码显示在屏幕上
  7. DID去中心化身份认证技术调研
  8. python plc fx5u_三菱PLC FX5U CPU模块专用指令的处理内容
  9. PVE系列教程(七)、安装iKuai软路由
  10. JS 实现图层模式覆盖效果
  11. linux kernel2.6中软中断运行线程ksoftirqd的创建
  12. OSG 高效渲染 之 多线程模型与渲染
  13. 2021最新解除微信黑号方法
  14. access中dbs和dbms_DB、DBS、DBMS三者的关系是什么?
  15. LocalDate 计算两个日期相差天数
  16. java csrf_java – 如何在使用CSRF登录后启用Spring Secu...
  17. VUE后台管理系统模板
  18. 项目启动bug记录:出现报错:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedd
  19. Java在线教育项目 第一天项目介绍和工程搭建
  20. MDK5批量修改文件目录

热门文章

  1. 怎么改vue项目的标题_如何动态修改Vue项目中的页面title
  2. php创建mysql计划任务_有关创建PHP-MySQL后台任务的建议
  3. woocommerce产品选项卡描述_适合WooCommerce卖家的7款Dropshipping插件+功能介绍
  4. comparator比较器用法_Python学习:好像很少人知道 Python iter() 的另外一个用法?...
  5. Hyper-V 和Ubuntu Server 16.04 配置静态IP
  6. Jupyter中那些神奇的第三方拓展魔术命令
  7. 玩转 Pandas 的 Groupby 操作
  8. 【机器学习】朴素贝叶斯
  9. 数据分析、机器学习必读书,李航《统计学习方法》发布算法推导视频啦!(附作业讲解)...
  10. HTML里的表格不能复制粘贴,表格之间无法复制粘贴怎么办_两个EXCEL表格为什么不能复制和粘贴-win7之家...