Android的底层是纯粹的linux内核,可以简单的理解为上面跑了个Dalvik Java虚拟机而
已。因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。
很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。
有两种方式获取交叉编译所需的工具链:git下prebuilt这个project或者直接去下载NDK,我这里arm-eabi的版本是最新的4.4.0。
1
git clone git://android.git.kernel.org/platform/prebuilt.git
然后创建一个helloworld.c文件。
1
2
3
4
5
6
//// root@delleon:~/android/myapp# cat helloworld.c
#include <stdio.h>
int main() {
printf("HelloWorld!n");
return 0;
}
接下来创建Makefile文件。注意修改其中的NDK_DIR和SDKTOOL为自己的目录,修改APP为自己的待编译程序主文件名。另外注意自己的arm-eabi的版本,若有变化则也需要修改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#### root@delleon:~/android/myapp# cat Makefile
APP=helloworld
NDK_DIR := ~/android/android-ndk-r4
NDK_HOST := linux-x86
SDKTOOL := ~/android/android-sdk-linux_86/tools
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/bin/arm-eabi-
CC := $(TOOLCHAIN_PREFIX)gcc
CPP := $(TOOLCHAIN_PREFIX)g++
LD := $(CC)
COMMON_FLAGS := -mandroid -ffunction-sections -fdata-sections -Os -g
--sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm
-fPIC
-fvisibility=hidden
-D__NEW__
CFLAGS := $(COMMON_FLAGS)
CFLAGS += -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG
CFLAGS += -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -Bdynamic
CPPFLAGS := $(COMMON_FLAGS)
-fno-rtti -fno-exceptions
-fvisibility-inlines-hidden
LDFLAGS += --sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm
LDFLAGS += -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/arm-eabi/lib
LDFLAGS += -nostdlib -lc -llog -lgcc
--no-undefined -z $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o
OBJS += $(APP).o
all: $(APP)
$(APP): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
%.o: %.cpp
$(CPP) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
install: $(APP)
$(SDKTOOL)/adb push $(APP) /data/local/bin/$(APP)
$(SDKTOOL)/adb shell chmod 755 /data/local/bin/$(APP)
run:
$(SDKTOOL)/adb shell /data/local/bin/$(APP)
clean:
@rm -f $(APP).o $(APP)
最后直接make,然后make install进手机里看一下吧。通过adb shell和手机里的Terminal等软件执行的结果是一样的。
toolchain
后记:还有一个叫Codesourcery的工具链,下载下来有130多M,我使用它来编译helloworld时无误但是放到手机上则运行不起来。不想细究了,我认为NDK提供的工具链已经非常优秀。感兴趣的朋友可以自己试试Codesourcery。
分享到:
相关推荐
在Android平台上进行C/C++开发,需要搭建一个合适的编译环境。这个过程涉及到多个步骤,包括获取必要的工具链、配置环境变量以及理解Android的NDK(Native Development Kit)。本篇文章将详细阐述如何在Android设备...
在本教程中,我们将深入探讨如何在Eclipse环境中集成NDK,以便更方便地编译和调试C/C++代码。 首先,我们需要了解NDK的基本构成。NDK包含了一系列交叉编译器、链接器和其他工具,用于将源代码转换为适用于不同...
从Android NDK安装ARM交叉编译工具链涉及的技术领域包括Android开发、交叉编译、NDK使用、ARM架构以及Linux环境下的编译工具使用。以下是详细的知识点解析: Android NDK(Native Development Kit)是Android应用...
【C/C++ Android开发环境配置】是Android原生开发中的重要环节,主要涉及三个关键工具:Android NDK、Android SDK和Ant。以下是这些工具的详细配置步骤和使用方法。 一、Android NDK NDK(Native Development Kit)...
- NDK提供了一系列的交叉编译工具,使得开发者可以在非Android设备上编译出能在Android设备上运行的库。 - NDK的主要用途包括:性能敏感的计算、使用开源C/C++库、游戏引擎集成等。 2. **下载与安装** - 首先,...
1、搞音视频必须有扎实的C/C++开发语言基础、 JNI基础,学会如何交叉编译 FFmpeg 等 C/C++库; 2、其次,我们需要阅读大量的音视频规范/协议文档(如H264、MP4/FLV、RTP/RTCP等)。这些文档中的内容基本都以位为单位...
NDK提供了一系列的工具,包括编译器、链接器和其他用于构建原生C/C++代码的工具,这些工具同样可以用于交叉编译Python。 2. **配置环境**:设置必要的环境变量,如`NDK_PATH`指向你的NDK安装目录,`ANDROID_ABI`...
在Ubuntu操作系统上搭建Eclipse C++和Java的交叉编译环境是一个重要的步骤,这对于开发者来说是必不可少的。本文将详细讲解如何配置这个环境,以便同时进行C++和Java的开发。 首先,我们需要确保系统已经安装了基本...
在Android开发中,有时我们需要利用C或C++的高性能特性,比如处理图形计算、音频处理等,这时就需要在Java和C/C++之间进行交叉调用。Android Studio支持这种跨语言调用,主要通过Android Native Development Kit ...
这个压缩文件包含了ARM架构(Android常用的处理器架构)的交叉编译工具链,使得可以在Android设备上编译针对ARM处理器的C和C++代码。解压此文件后,需要将其安装到Android设备上。 `remove.sh`和`install.sh`是脚本...
在Ubuntu系统上搭建Android NDK编译环境是Android原生代码开发的重要步骤,适用于那些需要进行C/C++底层开发或优化的应用程序。Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用...
1. **环境准备**:确保你已经安装了适用于Android的交叉编译工具链,如NDK(Native Development Kit)。NDK包含了针对不同Android架构的GCC或Clang编译器,以及其他必要的构建工具。 2. **获取libvpx源码**:从官方...
本文将深入探讨Android NDK以及如何在Windows环境下借助Cygwin进行交叉编译。 **一、Android NDK的基本概念** 1. **NDK的定义**:Android NDK是一套工具集,它提供了在Android应用中使用C和C++代码的能力。这使得...
Android NDK是一套用于构建原生C/C++代码的工具集,它包含了针对不同Android版本的交叉编译器,如gcc和g++,以及ndk-build和ndk-gdb等编译和调试工具。请从官方地址...
同时,需要设置好交叉编译环境,包括指定正确的 ABI(应用二进制接口)和 SDK 目标版本。 2. **获取源码**:从官方仓库或镜像站点下载 GMSSL 3.0 的源代码,解压到工作目录。 3. **配置编译**:使用 Android NDK ...
在Android开发过程中,有时我们需要对特定的硬件平台进行编译,这时就需要用到交叉编译工具。本资源是针对Android 4.2 (API Level 17) 的交叉编译工具,具体是从`android-ndk-r9d-linux-x86_64.tar.bz2`这个NDK版本...
本教程将详细介绍如何在Android环境中,利用交叉编译技术为Android平台构建LAME和FDK-AAC的动态链接库(.so文件)。 LAME是一个开源的MP3编码库,能够将PCM音频数据转换为高质量的MP3格式。而FDK-AAC是Fraunhofer ...
2. **Android NDK**:NDK允许开发者在Android应用中使用C/C++代码,提供了一个交叉编译环境,将源代码编译为Android目标平台的二进制文件。NDK包含了针对不同Android架构(armeabi、armeabi-v7a、arm64-v8a、x86、...
这里的“arm-linux-androideabi”是一个交叉编译工具链标识,它包含了针对Android平台的ARM处理器的编译器、链接器和其他工具。"4.9"表示这个工具链基于GCC(GNU Compiler Collection)4.9版本,这是一个稳定的...