Compile a native C Android application
2019独角兽企业重金招聘Python工程师标准>>>
http://www.cnblogs.com/GoAhead/p/4186707.html
通过上网搜索,你可以发现很多种编译Android native应用的方法.我想说的是,不同的控制台应用, 守护程序(daemon), C/C++库,等等.这些程序在你自己的计算机上
编译没有任何问题.
为了给Android编译程序,你需要ARM工具链(toolchain). 我发现有两种主张,分别是使用Android Prebuild toolchain和CodeSourcery
1)Android Prebuild toolchain
Android没有使用传统的libc库.相反,它用了Bionic库,一个由Google开发的,用在Android移动软件平台上的轻量级的libc
Bionic被裁剪到只支持 Android系统. 请看 六百万美元的c程序库
2)CodeSourcery
CodeSourcery是ARM的合作伙伴. 专门为ARM处理器开发增强GUN工具链的,并提供验证过的GNU工具链.这些工具链有很多不同的版本.
对于Android平台,需要 arm-none-linux-gnueabi, 而 arm-none-eabi是没有glibc包含在里面的,主要面向那些编译完整的native库和应用(比如FreeRTOS)
译者注: arm-none-eabi就是用来编译裸机程序的,请参考 最简单的ARM裸机程序
我个人的观点,如果白手起家开始创建一个Android的应用程序,你应该选择Bionic.
但是如果你选择从你的PC环境移植一个库到Android,你应该选择CodeSourcery
如果你使用到线程或者C++异常,Bionic库也不能完全支持它们(实际上,它根本就不支持异常)
agcc.pl是Andrew Ross开发的一个脚本,让你以一种很简单的方法来自动包含常用的库,使用Android的ARM工具链gcc
某种程度上,他像makefile
第1种方法 使用Makefile和Android NDK
AR = arm-linux-androideabi-ar
AS = arm-linux-androideabi-as
CC = arm-linux-androideabi-gcc
CXX = arm-linux-androideabi-g++
LD = arm-linux-androideabi-ld.goldNDK_KIT = /home/tim/android-ndk-r10b
PLATF_KIT = platforms/android-9ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include
ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/libOBJS = hello.o
EXES = hellohello : hello.o$(LD) --dynamic-linker=/system/bin/linker -nostdlib \-rpath-link=$(ARM_LIB) \$(ARM_LIB)/crtbegin_dynamic.o \-L$(ARM_LIB) -lc \-o hello hello.ohello.o: hello.c$(CC) -I $(ARM_INC) -c hello.cclean:rm -f $(OBJS) $(EXES)
源代码
#include <stdio.h>int main(int argc, char* argv[])
{printf("Hello Android\n");return 0;
}
设置环境变量 envsetup.sh
export PATH=$PATH:/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
最后,运行 make 就可以了
关于 -rpath-link选项,请参考 gcc链接选项
第二种简单方法,使用shell脚本
#!/bin/shOS='linux'
ANDROIDSDK='android-14'PROGDIR='/home/tim/android-ndk-r10b/'PROGDIR=`cd $PROGDIR && pwd`
ARMEABIGCC=$PROGDIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
ARMEABILIB=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/lib
ARMEABIINC=$PROGDIR/platforms/$ANDROIDSDK/arch-arm/usr/include
ARMEABICRT="$ARMEABILIB/crtbegin_dynamic.o $ARMEABILIB/crtend_android.o"LINKER=/system/bin/linkerecho "GCC:"$ARMEABIGCC "LIB:"$ARMEABILIB "LINKER":$LINKER "PARAMS:"$@
echo "CRT:"$ARMEABICRT$ARMEABIGCC $@ -Wl,-rpath-link=$ARMEABILIB,-dynamic-linker=$LINKER -L$ARMEABILIB $ARMEABICRT -I$ARMEABIINC -nostdlib -lc
保存为b
./b hello.c -o hello
就可以了
实际就是运行命令
/home/tim/android-ndk-r10b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc \-Wl,-rpath-link=/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib,-dynamic-linker=/system/bin/linker \-L/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib \/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtbegin_dynamic.o /home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/lib/crtend_android.o \-I/home/tim/android-ndk-r10b/platforms/android-16/arch-arm/usr/include -nostdlib -lc \hello.c -o hello
crtbegin_dynamic.o 和 crtend_android.o必须配对使用
第三种方法,用–sysroot也是可以的
#!/bin/shNDK=/home/tim/android-ndk-r8e
SYSROOT=$NDK/platforms/android-9/arch-arm
CC="$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
CFLAGS='-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
LDFLAGS='-Wl,--fix-cortex-a8'
$CC $@
http://www.srombauts.fr/2011/03/06/standalone-toolchain/
#include <stdio.h>
#include <android/log.h>#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "hello-ndk", __VA_ARGS__))int main(void)
{printf("Hello from NDKn");LOGI("Hello from NDK");return 0;
}
果然厉害,上面这段代码都可以这样编译
./b9 -l log nl.c -o hn
用Makefile也能搞
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =hello-ndkall: $(SRC) $(EXE)$(EXE): $(OBJ)$(CC) -o $@ $^ $(LDFLAGS)%.o: %.c$(CC) -o $@ -c $< $(CFLAGS)clean:rm -f *.o $(EXE)
编译so库也是可以,厉害
CC = arm-linux-androideabi-gcc
CFLAGS = -Wall -g
LDFLAGS = -llog -shared
SRC =hello-ndk.c
OBJ =$(SRC:.c=.o)
EXE =libhello-ndk.so
还可以直接运行 gcc
/home/tim/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/home/tim/android-ndk-r10/platforms/android-3/arch-arm -lc -lm -g main.c -o mm
第4种方法,用ndk-build
创建工程目录hello,然后在其下创建子目录jni
然后在jni下创建两个文件,一个是hello.c,另外一个是Android.mk,内容如下
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=hello.c
LOCAL_MODULE := helloworld
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
其中 LOCAL_MODULE_TAGS := optional 这行可以不要
进入到hello目录下,运行下面的命令
# export NDK_PROJECT_PATH=`pwd`
# ndk-build
Compile thumb : helloworld <= hello.c Executable : helloworld Install : helloworld => libs/armeabi/helloworld
转载于:https://my.oschina.net/ruiwong/blog/626094
Compile a native C Android application相关推荐
- React Native和Android整合详解
前言 按照React Native的迭代速度,使用官网的文档,已经不能很顺利的实现React Native和Android的有效整合.React Native最新版本 已经是0.39.为了更好的讲解R ...
- android 控件id为0,Android Studio错误:(3,0)未找到ID为“com.android.application”的插件...
我是 Android工作室的新手,有人写了一个最初用于应用发明家的应用程序.我按照他的模板,添加了新的东西.该应用程序与Gradle有问题,并给我以下内容. "Error:(3, 0) Pl ...
- Android application 中使用 provided aar 并没有那么简单
前言 首先简单讲一下这个需求的背景,大部分场景下,是没有这个需求的,这个需求出现在插件化中,当一个android插件引用aar中的类的时候,并且这个插件是使用com.android.applicati ...
- Android方法调用实体类的值,React Native调用Android原生方法和传值
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 创建react native 项目:react-native init callAndroidProject cd ca ...
- Flutter如何与Native(Android)进行交互
目录 前言 BasicMessageChannel Android端- (1)不使用engine cache预热 (2)使用engine cache预热 Flutter端- MethodChannel ...
- 20分钟理解React Native For Android原理
原址:http://doslin.com/2017/03/15/react-native-source-code-analysis/ 前言 文中所有 RN 缩写指代React Native For A ...
- react native开发Android 篇——APP名称、图标、启动页
react native开发Android 篇--APP名称.图标.启动页 设置APP名称 设置APP图标 设置启动页 隐藏启动页 设置APP名称 编辑 android/app/src/main/re ...
- android application 引起内存泄漏的原因
转自 http://hi.baidu.com/justtmiss/item/c939cd293b5096fc51fd87fe http://developer.android.com/resource ...
- android 360状态栏显示,如何从Android应用程序显示360全景(How to display a 360 panorama from android application)...
如何从Android应用程序显示360全景(How to display a 360 panorama from android application) 我想从我的Android应用程序中显示一个全 ...
最新文章
- extjs4mvc增删改查_asp.net下利用MVC模式实现Extjs表格增删改查
- Unix整理笔记——安全性——里程碑M13
- c++ 三维数组 初始化_013 JAVA 多维数组及数组的拷贝、冒泡排序、二分法查找...
- Xamarin 技术全解析
- 与你邂逅——软件工程
- windows 环境下.Net使用Redis缓存
- IPv6下一代互联网现在就出发!
- 姿态估计2-03:PVNet(6D姿态估计)-白话给你讲论文-翻译无死角(1)
- Flutter与原生混合开发
- 看机器学习如何预测债券收益率
- R语言将数值转换为比例
- IT技术员的发展方向和晋升秘笈
- 9-17每日一题:Leetcode36. 有效的数独
- 基于阿里云CentOS进行Docker尝试
- 高亮显示化学结构式中的子结构----Highlight a substructure in the depiction
- 虚幻UE4/5中如何使用材质节点旋转贴图
- oracle ora 3136,oracle中ORA-3136,ORA-609
- java swing+mysql简单零件销售管理系统、订货决策系统
- 电池pack结构_锂电池包PACK结构设计需要考虑哪些因素?
- 405074-81-9,ANW-29430,AG-F-43653杂环有机化合物
热门文章
- 信元模式mpls 避免环路_【基础】交换机堆叠模式
- leetcode181. 超过经理收入的员工(SQL)
- (十)深入浅出TCPIP之网络阻塞和非阻塞
- 《Python Cookbook 3rd》笔记(1.9):查找两字典的相同点
- xlsx文件打开乱码_Excel 2016 双击无法打开xlsx文件怎么办?
- multism中ui和uo应该怎么表示_王者荣耀:梦泪直播时谈到体验服大改动,表示装备的改动很关键...
- anaconda中怎么sh_【好工具】 深度学习炼丹,你怎么能少了这款工具!JupyterLab 远程访问指南...
- 使用memcmp函数判断两个函数的前n位字节数是否相等
- 基于属性加密的ABE算法的应用场景思考展望
- 算法入门篇八 贪心算法