Android原生(Native)C开发之八:Toolchain环境搭建篇

交叉编译-5:使用NDK和CMake在Linux上编译Android动态库 之前接触过使用CMake编译IOS的项目,开始编译Android库时候,不是很熟悉Android.mk的编译方式,所以继续沿用CMake编译Android的库。使用gcc编译出来的库在Android stutio上使用时候App有些是可以直接用,但有些动态库会有一些奇奇怪怪的错误。所以换了最新版本的NDK,并采用clang编译,这下编译出来的库在Android stutio上使用是没... 阅读详情

Android开源已经有一段时间了,一直没有去研究它,一是没有时间,二是没有Linux环境去测试,三是块头太大了(源码2G,加编译要5G左右)。
最近项目差不多近尾声了,终于可以喘口气,有时来好好研究一下Android的源码了,就在WinXP中从网上下载了Android的源码,一开始只是想看看自已感兴趣的部分(GUI、OpenGL ES、Audio等),后来在网上找到了一些在Cygwin下搭建原生开发环境的文章,于是就自已试了下,发现不要Linux、不下全部源码进行原生开发完全是可行的!

首先,要装Cygwin这个“活宝”,网上有很多相关的文章,下载包时请选择中国的镜像:http://www.cygwin.cn,比较快,如下包一定要安装:gcc、make、Flex、bison、gettext、gettext-devel、textinfo,另外一定要装 git 包,下源码就靠它了;

其次,Cygwin及git安装好了,进入Cygwin,输入git --version,如果能正确显示就表示git安装没有问题,就可以开始有选择地下载Android的源码了。Android的源码太多了,如果只为原生开发,只要下载bionic及build两个包,先为Android源码建一个目录,进入此目录,再按如下步骤取源码:
1. bionic,Android没有用 glibc,用的是google自已写的 bionic Libc,小是小,快是快,但有一个最大问题,对C++的兼容不好(这是后话)。命令如下:
git clone git://android.git.kernel.org/platform/bionic.git
2. build,其实我们只是要参考Android的一些编译链接选项,命令如下:
git clone git://android.git.kernel.org/platform/build.git
3. system/core,其实我们只是要一个头文件:AndroidConfig.h,也可直接从android git web上下载:http://android.git.kernel.org/?p=platform/system/core.git;a=blob_plain;f=include/arch/linux-arm/AndroidConfig.h;hb=HEAD,如果要下整个目录,命令如下:
git clone git://android.git.kernel.org/platform/system/core.git
4. frameworks/base,如果要进行 opengl es 的3D开发,一定要下载这个包,因为opengl es的头文件在这个包中,命令如下:
git clone git://android.git.kernel.org/platform/frameworks/base.git

更多Android项目信息请访问:http://android.git.kernel.org/,大家可根据自已的兴趣选择下载。

再次,下载Android订制的toolchain的源码( http://android.git.kernel.org/pub/android-toolchain-20081019.tar.bz2),编译步骤如下:
1.解压文件,并进入目录,执行如下命令配置要编译的target及安装的目录:
./configure --target=arm-eabi --prefix=/cygdrive/d/Android/cupcake/toolchain
虽然安装目录可稍后安装配,但推荐在配置时设置好,目录一定要是绝对路径,如要装在 D:\Android\cupcake\toolchain,则为:/cygdrive/d/Android/cupcake/toolchain。
2.执行:make build 命令,如果有错误按提示再编译,一般没有什么大问题;
3.安装:make install。

Toolchain编译安装完成后,就要开始进行一些环境配置的动作了,网上说直接将bionic的一些头文件复制到 $toolchain/arm-eabi/include,一般情况是,但先执行如下看一下:
$arm-eabi-cpp -v

一般gcc会从如下3个目录去搜索头文件:
$toolchain/lib/gcc/arm-eabi/4.2.1/include
$toolchain/arm-eabi/sys-include
$toolchain/arm-eabi/include

如下头文件需从android源码目录复制到toolchain目录$toolchain/lib/gcc/arm-eabi/4.2.1/include:
bionic/libc/arch-arm/include
bionic/libc/include
bionic/libstdc++/include
bionic/libc/common
bionic/libc/arch-arm
bionic/libm/include
bionic/libm/include/arch/arm (好象找不到此目录,ignore it!)
bionic/libthread_db/include
frameworks/base/opengl/include (3D开发,一定要加此目录!)

其中,一些头文件有重复:limits.h一定要用bionic/libc/include目录的,endian.h 用 bionic/libc/arch-arm/include,再将system/core/include/arch/linux-arm目录下的AndroidConfig.h文件复制到$toolchain/lib/gcc/arm-eabi/4.2.1/include。

头文件复制完成了,接下来复制库文件,库文件因没有所有源码不能通过编译得到,只好从模拟器中pull下来,这次要用到一个工具: busybox。
从网上下载 busybox的可执行程序,启动模拟器,将busybox push上去,执行:
$adb push busybox /dev/sample/busybox
$adb shell chmod 777 /dev/sample/busybox
$adb shell ./dev/sample/busybox tar -cf /dev/sample/libs.tar /system/lib
$adb pull /dev/sample/libs.tar libs.tar
这样就将模拟器下的 /system/lib 目录的所有库(so)文件打包并下载下来了,解压libs.tar就得到了我们所需要的所有库文件,执行如下命令:
arm-eabi-ld --verbose 或 arm-eabi-ld --verbose | grep SEARCH_DIR
复制所有库文件到 SEARCH_DIR(一般是$toolchain/arm-eabi/lib)目录下,同时将 toolchain 的编译脚本 armelf.x armelf.xsc 从下载的Android的源码目录的 build/core 复制到同目录。

至此,环境基本上搭建完成,可以试着编译一个 hello world C 源码了。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
      int i;

      printf("argc\t = %d\n", argc);
      for (i = 0; i < argc; i++) {
                  printf("argv[%d]\t = %s\n", i, argv[i]);
      }
     
      printf("Hello world!\n");;

      return 0;
}
编译命令如下:
$ arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker -include AndroidConfig.h -lc -o hello hello.c
得到警告:
warning: cannot find entry symbol _start; defaulting to 000082c8
没有入口函数 _start,加上再编译,成功了,push至模拟器执行看一下:
$ adb shell ./dev/sample/hello
argv[0] = (null)
argv[1] = (null)
argv[2] = (null)
argv[3] = (null)
argv[4] = (null)
argv[5] = (null)
argv[6] = (null)
argv[7] = (null)
argv[8] = (null)
argv[9] = (null)
argv[10] = (null)
argv[11] = ./dev/sample/hello
argv[12] = (null)
argv[13] =
argv[14] = (null)
[1]    Segmentation fault          ./dev/sample/hello
很不幸,Segmentation fault!好象加_start也不是那么有用,看样子非得要象build的makefile中说的,要crtbegin_dynamic.o和crtend.o,但没有编整个源码,怎么得到这两个文件呢?
答案就在下载的Android的源码bionic的目录中,进入$android_src/bionic/libc/arch-arm/bionic,你会发现在很多汇编文件,其中我们想要的 crtbegin_dynamic.S,crtend.S就在其中,编译它们:
arm-eabi-gcc -mthumb-interwork -o crtbegin_dynamic.o -c crtbegin_dynamic.S
arm-eabi-gcc -mthumb-interwork -o crtend.o -c crtend.S
不出意外,将得到 crtbegin_dynamic.o & crtend.o,再来编译我们的hello.c
$arm-eabi-gcc -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker -include AndroidConfig.h -lc -o hello hello.c crtbegin_dynamic.o crtend.o
将生成的hello push到模拟器,再执行,如下:
$adb push hello /dev/sample/hello
$adb shell chmod 777 /dev/sample/hello
$adb shell ./dev/sample/hello A B C
输出如下:
argc        = 4
argv[0]  = ./dev/sample/hello
argv[1]  = A
argv[2]  = B
argv[3]  = C
Hello world!
这正是我们想要看到的。
Android原生(Native)C开发之八:Toolchain环境搭建篇

 

 

参考网站:

React Native开发环境搭建与优化指南 跨平台移动开发框架React Native通过JavaScript核心实现原生组件渲染,其核心原理是将React组件树转换为平台特定的UI元素。这种架构显著提升了代码复用率,使开发者能够用单一代码库构建Android和iOS应用。在工程实践中,环境配置是关键环节,涉及Node.js运行时、Java开发套件以及平台工具链的协同工作。针对Windows/macOS系统差异,需要特别注意Hyper-V虚拟化、CocoaPods等平台专属配置。通过合理配置VS Code插件组合和Metro打包服务,可以大幅提升开发 阅读详情

相关推荐

Windows平台Android NDK开发环境搭建指南

NDK(Native Development Kit)是Android开发中用于集成C/C++代码的工具集,特别适合性能敏感型应用开发。其核心原理是通过JNI(Java Native Interface)实现Java与原生代码的交互,能显著提升计算密集型任务的执行效率。在Windows平台搭建NDK环境时,开发者需要关注Android Studio配置、NDK版本管理以及CMake构建系统的集成。典型应用场景包括游戏引擎、音视频处理和计算机视觉等高性能需求领域。本文以Windows 10/11为基准环境,详

weixin_33875839的博客 437

生成android toolchain

android ndk standalone toolchain

3CDFP 2778

使用CLion高效开发Android AOSP原生模块:从环境配置到实战调试

本文详细介绍了如何使用CLion高效开发Android AOSP原生模块。通过利用AOSP构建系统自动生成CMake工程文件,开发者可以在CLion中获得智能代码补全、精准跳转和强大的图形化调试能力,从而显著提升Native代码的开发与调试效率。

weixin_28829629的博客 132

【转】Android原生(Native)C开发之八:Toolchain环境搭建篇

<br /><br />Android原生(Native)C开发之八:Toolchain环境搭建篇<br /><br />(2009-04-20 12:37:09)<br /><br />转载<br />标签:<br />gcc<br />linux<br />android<br />cygwin<br />toolchain<br />分类:Android<br />Android开源已经有一段时间了,一直没有去研究它,一是没有时间,二是没有Linux环境去测试,三是块头太大了(源码2G,加编译要5G

zysee的专栏 590

Android JNI开发环境搭建与实战指南

JNI(Java Native Interface)是Java与本地代码(C/C++)交互的标准接口,通过JNI可以实现Java与Native代码的无缝集成。其核心原理是通过特定的命名约定和数据类型映射,在Java虚拟机与本地库之间建立桥梁。在Android开发中,JNI技术常用于性能敏感模块开发、复用现有C/C++库等场景。本文以Android Studio为开发环境,详细介绍NDK工具链配置、CMake构建系统集成、JNI方法注册与调用等关键技术点,并分享多ABI支持、Native代码调试等工程实践技巧

weixin_34405557的博客 351

mujoco 机器人强化WARNING: Nan, Inf or huge value in CTRL at ACTUATOR 0. The simulation is unstabl...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1525

转帖:Android原生(Native)C开发

Android原生(Native)C开发:查看编译器预定义宏http://www.csharpwin.com/dotnetspace/4102r4305.shtmlAndroid原生(Native)C开发:编译选项小结Android原生(Native)C开发之十:用Code::Blocks来开发Android原生(Native)C开发之九:OpenGL ES初探An

Tom Song的专栏 949

Android Toolchain环境搭建篇

Android Toolchain环境搭建篇

Windows下NDK开发环境搭建-VsCode

本文介绍了Android NDK开发的基本概念及其与JNI的区别,指出NDK是Android提供的工具包,用于编译能在Android平台运行的Native代码(动态库/静态库/可执行文件),而JNI是Java调用C/C++的标准机制。文章重点演示了在VSCode中搭建NDK开发环境的步骤,包括工具下载(NDK、CMake、Ninja)、环境变量配置,以及通过CMakeLists.txt和批处理脚本实现跨平台编译。作者强调理解命令行工具的本质比依赖图形化界面更重要,并提供了通用编译脚本模板,适用于不同项目的快

学习、分享、成长。 491

台积电技术研发实力

台积电技术研发实力 台积电在半导体行业的地位毋庸置疑。他们究竟有多强大,大部分读者了解得可能非常片面。从最新公布的2019年财报里,看看台积电的真正实力。 一、台积电在市场上的地位 根据公司财报,台积公司在先进制程技术、特殊制程技术,以及先进封装技术的发展上持续领先全球集成电路制造服务领域,2019年的市场占有率为52%。台积公司总体营收以地区划分(主要依据客户营运总部所在地),来自北美市场的营收占台积公司总体营收的60%、日本与中国大陆以外的亚太市场占9%、中国大陆市场占20%、欧洲、中东及非洲市场占6

吴建明wujianming_110117 1901

Amber实战:小分子配体MD模拟全流程避坑指南(附磷酸基团处理技巧)

本文提供了一份基于Amber软件进行小分子配体分子动力学模拟的实战避坑指南。详细解析了从晶体结构预处理、配体参数化(重点探讨AM1-BCC与RESP电荷选择)、复合物体系构建到模拟稳定性调试的全流程。特别针对磷酸基团等特殊官能团处理中常见的模拟崩溃问题,给出了系统性的诊断与解决方案,旨在帮助研究者获得稳定可靠的模拟结果。

weixin_29237635的博客 682

Android原生(Native)C开发之一:环境搭建篇

Android是基于Linux的操作系统,处理器是ARM的,所以要在Linux或Windows等x86系统上编译Android能运行的程序,你需要一个交叉编译器。 在Linux下面,你可以自已编译一个交叉编译环境,但Windows下面,就比较复杂(也可以在cygwin中编译一个),但你可以选择下载一个现成的交叉编译环境: http://www.codesourcery.com/gnu_tool...

Ancool 259

射频指纹识别技术:原理、应用与深度学习实现

射频指纹识别(RFFI)是一种基于硬件特征的设备身份认证技术,通过分析无线设备发射信号中的独特硬件特征实现设备识别。其核心原理源于发射器硬件电路的非线性特性,如功率放大器的相位噪声和混频器的非线性失真,这些特征具有难以伪造的特点。在物联网和边缘计算场景中,RFFI技术展现出独特优势,尤其在智能家居和工业物联网中,能有效防止非法接入和设备伪造。深度学习方法的引入进一步提升了RFFI的性能,通过自动特征提取和端到端优化,显著提高了识别准确率。本文详细探讨了RFFI的技术原理、应用场景及实现方法,为相关领域的研究

weixin_30457465的博客 891

超详细RTranslator安卓编译零基础教程:从环境搭建到成功运行

作为开发者,你是否曾因以下问题放弃编译开源项目: - 文档零散,关键步骤缺失 - 环境配置复杂,版本依赖冲突 - 编译报错无从下手,社区反馈缓慢 - 模型文件体积庞大,下载困难 本文将以RTranslator(世界首个开源实时翻译应用)为例,提供**100%可复现**的安卓编译全流程。按照本指南操作,即使零基础开发者也能在3小时内完成从环境搭建到APP运行的全过程。**读完本文你将获得**: -...

gitblog_00972的博客 1145

MinerU安装指南:从源码到验证的完整流程

本文详细介绍了MinerU文档转换工具的安装流程,从源码获取、依赖安装到验证步骤,提供了完整的安装指南和常见问题解决方案。特别适合技术写作者和开发者快速部署这款高效的文档转换工具,提升工作效率。

weixin_29243279的博客 546

SAP SD科目确定:从配置到凭证的财务集成核心

本文深入解析SAP SD科目确定的核心价值与配置实践,涵盖从主数据准备到财务凭证生成的全流程。通过六步配置法和KOFI00过程拆解,帮助企业实现销售与财务模块的高效集成,确保收入、成本等数据准确归集至对应会计科目,提升财务自动化水平与数据准确性。

weixin_33491377的博客 251

android native 代码混淆,利用OLLVM混淆Android Native代碼篇一

Author: GeneBlue這里將會用兩篇文章解釋OLLVM混淆Android Native代碼的方法和原理。篇一主要聚焦NDK中OLLVM的編譯構建和主要混淆模式的使用,並簡要解釋各混淆模式的效果;篇二主要研究默認混淆模式的實現並嘗試編寫調試自定義Pass。0X01 OLLVM簡介OLLVM(Obfuscator-LLVM)是瑞士西北應用科技大學安全實驗室於2010年6月份發起的一個項目,該...

weixin_31977649的博客 888

Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)

本不想写这篇文章的,因为在Linux下已经配置过很多次,想着mac应该找篇文章一次就搞定了,结果还是踩坑,看了很多文章,不是某一点没不清楚,就是截图有问题或者命令有问题,官网又难得找等等……花了3个多小时才搞定,所以,还是来总结一篇文章就能够搞定的教程。 为什么要用zsh?用了这么多年的bash,不能说bash不好,不过当我用了zsh后发现,什么叫更好用。 配置过程稍微有点繁琐,但是你看过效果...

mickjoust的技术小屋 1万+

Android原生(Native)C开发之十:用Code::Blocks来开发

-- 用Code::Bocok搭建Android Native可视化开发环境 可能很多朋友一直用文本编辑器来写Android的程序,经常会出现一些变量写错一个字母或少逗号分号的情况,直到编译时才会有错误提示,而且效率不高。如果你正为这个苦恼的话,我郑重且强烈地向你推荐:Code::Blocks! 关于Code::Blocks,我就不多介绍了,只记得三年前用过后,就很少用Dev ...

50

数字后端实战指南 | Innovus Function ECO全流程解析(从LAB到Tapeout)

本文深入解析了在Cadence Innovus工具中进行Function ECO的全流程实战指南。从LAB环境搭建到Tapeout前的签核验证,详细拆解了Pre-mask与Post-mask ECO的核心步骤、关键命令(如ecoDesign)以及常见避坑方案。重点阐述了如何应对时序、DRC等挑战,并强调了备用单元管理与严格验证的重要性,是数字后端工程师提升综合能力的必备参考。

weixin_28452161的博客 643

Coze智能体开发:搭建一个解析 PDF 文件的工作流

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 2814

Android原生开发之十一:用Code::Blocks+NDK开发调试

-- 用Code::Bocok + NDK 搭建Android Native可视化开发及调试环境 记得最后一次写Android Native开的系列是去年6.1号,过去整整一年多了。虽然Android已经很火了,google为什么至今天仍然没有推出完善的NDK开发调试环境呢?!

maikforever 的专栏 1294

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

toolchain android,android.toolchain.cmake

# Copyright (c) 2010-2011, Ethan Rublee# Copyright (c) 2011-2014, Andrey Kamaev# All rights reserved.## Redistribution and use in source and binary forms, with or without# modification, are permitted ...

weixin_30682487的博客 1568

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 编译链位置,如何编译Android动态链编的native c/c++code

在另外一个帖子中,neil已经介绍了如何编译一个静态的native程序在Android中运行,本文主要说明如何编译动态链编的native程序。编译环境要求:下载Android的源码,并执行完一次完整的编译。以下的所有命令均是在编译后的源码根目录下执行。1. 编译C code同样以hello.c为例:#include #include int main(){printf("hello, world!...

weixin_32288959的博客 326

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: buildbot
下一篇: 定制ToolChain for ARM .
zm_21
博客等级 码龄14年 147粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值