网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月30日漏签0天
c语言吧 关注:801,687贴子:4,374,746
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 33回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

安卓原生C环境杂谈

  • 只看楼主
  • 收藏

  • 回复
  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近在研究ELF的加载以规避Android 10+的执行权限限制,实在太无聊了。想当年由于初高中时期没有自己的电脑,即使到了今天我在手机和电脑上完成的代码行数应该还是五五开的。我觉得这些几乎独一无二的经历应该有后来人可以参考的部分,打算写一篇贴子重新梳理一下几年来在手机上进行C/C++开发遇到的坑与趣事,以及一些冷门的要点与细节。更新速度可能会比较慢,想到什么写什么。
(自举移植的GCC镇楼)
这两个常用话题太难绷了哈哈哈
#include<stdio.h>#
#include<iostream>#


  • 羲和剑魂
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
lz下面呢


2025-12-30 18:05:47
广告
不感兴趣
开通SVIP免广告
  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
安卓(Android)是由谷歌公司推出的一款使用Linux内核的开源操作系统,主要用于移动设备。虽然使用了Linux内核,但安卓的上层构筑与常见GNU/Linux发行版大不相同,因此一般不能把安卓归类为常说的 "Linux操作系统" 。提供给应用层最多接口的其实是Java框架层,承载着它的是Java虚拟机(以前是Dalvik VM,现在是ART)。故安卓上C库那层并没有为应用提供太多系统特色接口,只有一些性能敏感的音视频方面,比如EGL、OpenGL ES、mediandk、camerandk、neuralnetwork等库提供,大多也要结合JNI配合Java/Kotlin那边用。当然现在安卓也允许你用NativeActivity实现纯C/C++应用开发,但是如果你想干像显示一个通知或toast,甚至唤起输入法这种小事还是要用JNI在C/C++代码里调用Java接口,真气人。


  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
但是C库层也不是吃闲饭的,毕竟它还得顶着安卓的Shell层,顶着Java虚拟机Android核心库及ART那一大堆...... 所以它的功能与性能重要性不容质疑,该有的内容还是要有的。由于本贴讲的就是安卓的C环境,那么下面就着重谈谈安卓的C运行时库。对于像EGL、OpenGL ES等特殊功能的C第三方库就先不讲了,毕竟相关教程不少,就不搁这当复读机了,它们也不是本次探讨的重点,之后分享趣事可能会提。


  • 四条咸鱼
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好帖


  • 贴吧用户_QKEMa7M
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个gcc挺有意思的,哪下载的


  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
马克


  • 以注册的昵称
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
马克


2025-12-30 17:59:47
广告
不感兴趣
开通SVIP免广告
  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我们都知道在使用scanf()或printf()等函数时要在开头写上#include <stdio.h>
#include是一条预处理指令,这里是让编译器中的预处理器按默认头文件搜索路径找到名为stdio.h的文本文件,把它的内容原样搬到你写#include的地方,在这个过程中printf与scanf函数的声明以及还有FILE NULL等常用的类型与宏定义等等等等等等也被搬进来了。如果你只使用了printf函数,不用stdio.h,自己在代码开头写上:int printf(const char *fmt, ...);也是可以正常编译运行的。
那么问题来了: printf()的定义在哪里?
这就是C运行时库(CRT)的事情了。一般来说,它会是编译好的机器代码,以动态链接库(Windows上是PE格式,后缀.dll;Linux上是ELF格式,后缀.so;下文如无特殊说明则安卓与常见GNU/Linux相同)的格式在你的硬盘上(文件系统)中保存。
当你在运行某个可执行文件(Windows上是PE格式,后缀.exe;Linux上是ELF格式,后缀无要求)时,操作系统或动态链接器会根据文件中的附加信息把它加载到内存里,映射到属于这个进程的虚拟地址空间,它依赖的动态链接库(包括CRT)也会进行类似的操作,但动态链接库的代码部分可以同时映射到多个进程的虚拟地址空间里,不用重复加载,大大节省了物理内存。而在映射完毕之后,动态链接器会像裁缝一样根据文件中的附加信息以类似填表的形式进行一些重定位操作,填好地址,你的代码便可以调用到printf了。


  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
与常见的GNU/Linux不同,安卓系统的C运行时库名为 Bionic
你可以在 https://github. com/aosp-mirror/platform_bionic 查看它的代码。


  • qishipai
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Bionic的ELF格式二进制文件可以在安卓系统以下路径找到:
64位:
动态链接器 /system/bin/linker64
/system/lib64/libc .so
/system/lib64/libm .so
/system/lib64/libdl .so
32位:
动态链接器 /system/bin/linker
/system/lib/libc .so
/system/lib/libm .so
/system/lib/libdl .so
libc .so里实现了printf() scanf() 等等函数,其实是系统调用的高级封装。而libm. so里实现了sin() cos()等浮点数学函数,libdl. so里则是dlopen() dlclose()等关于运行时动态加载库的函数。


  • 我是VV大王
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看不懂


  • 响木天音大将军
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
牛逼


  • YujiSY
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
马克


2025-12-30 17:53:47
广告
不感兴趣
开通SVIP免广告
  • 一周休七日
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 33回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示