![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android C++系列
文章平均质量分 85
轻口味
Android、音视频、AI相关领域从业者。
展开
-
Android C++系列:Linux信号(三)
本文介绍了可重入函数,信号引起的竞态和异步I/O,SIGCHLD信号处理,向想好捕捉函数传参,信号中断系统调用。原创 2024-07-19 19:32:19 · 534 阅读 · 0 评论 -
Android C++系列:Linux信号(二)
如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允 许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只 计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。原创 2024-07-19 19:30:43 · 569 阅读 · 0 评论 -
Android C++系列:Linux信号(一)
本文介绍了信号的编号,信号机制,信号产生的种类,信号产生的原因,以及进程处理信号的行为,信号集处理函数等。原创 2024-07-18 20:19:22 · 539 阅读 · 0 评论 -
Android C++系列:Linux线程(四)线程同步
本文介绍了线程同步机制:为什么要同步、互斥量、死锁、读写锁、条件变量、信号量、进程间锁等概念与机制以及相关示例。原创 2024-07-18 20:16:46 · 565 阅读 · 0 评论 -
Android C++系列:Linux线程(三)线程属性
本文介绍了线程属性:线程属性初始化、线程的分离状态、线程的栈地址、线程的栈大小;还介绍了线程的NPTL、线程终止方式、注意细节等注意事项。原创 2024-07-17 20:31:51 · 902 阅读 · 0 评论 -
Android C++系列:Linux线程(二)线程原语
本文介绍了linux 线程相关的七个函数:创建线程pthread_create、pthread_self、pthread_exit、pthread_join、pthread_cancel、pthread_detach、pthread_equal。原创 2024-07-17 20:31:02 · 535 阅读 · 0 评论 -
Android C++系列:Linux线程(一)概念
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。原创 2024-07-16 19:13:12 · 734 阅读 · 0 评论 -
Android C++系列:Linux文件IO操作(二)
本文介绍了read/write的系统调用,以及阻塞、非阻塞相关的概念以及配置方式,等待超时方式。还介绍了lseek、fcntl、ioctl文件操作相关的系统调用。原创 2024-07-16 19:11:51 · 636 阅读 · 0 评论 -
Android C++系列:Linux文件IO操作(一)
文本介绍了Linux下的文件操作命令、系统调用、API接口等。并介绍了C标准函数与系统函数的区别,PCB概念等。原创 2024-07-15 08:27:10 · 1185 阅读 · 0 评论 -
Android C++系列:Linux文件系统(二)
Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统 都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件 我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?当rm删除文件时,只是删除了目录下的记录项和把inode硬链接计数减1,当硬链接计数 减为0时,才会真正的删除文件。把目录指针恢复到目录的起始位置。原创 2024-07-15 08:24:22 · 1190 阅读 · 0 评论 -
Android C++系列:Linux文件系统(一)
本文介绍了经典的ext2文件系统的块结构:超级块、块组描述符表(GDT)、块位图、inode位图(inode Bitmap)。数据块(Data Block) 根据不同的文件类型对应情况,并介绍了数据块寻址方式。原创 2024-07-14 08:51:47 · 609 阅读 · 0 评论 -
Android C++系列:Linux网络(五)常见术语
网络信息从信源到信宿的路径。路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。确定最佳路径,通过网络传输信息。原创 2024-07-14 08:49:15 · 791 阅读 · 0 评论 -
Android C++系列:Linux网络(四)TCP详解
本文介绍了TCP的三次握手、四次挥手、11种状态、TCP滑动窗口流量控制、TCP半连接状态以及TCP TIME_WAIT两倍报文最大生存时长。原创 2024-07-13 22:25:40 · 948 阅读 · 0 评论 -
Android C++系列:Linux网络(三)协议格式
本文介绍了网络协议格式:数据包封装、以太网帧格式、ARP数据包格式、IP段格式、UDP数据包格式、TCP数据包格式等。原创 2024-07-13 22:23:36 · 682 阅读 · 0 评论 -
Android C++系列:Linux网络(二)通信过程
以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷 (payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示其实在链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线 (双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤等都属于物理层的概念。原创 2024-07-12 12:01:57 · 376 阅读 · 0 评论 -
Android C++系列:Linux网络(一)网络模型
两者都是以协议栈的概念为基础;协议栈中的协议彼此相互独立;下层对上层提供服务OSI先有模型;TCP/IP是先有协议后有模型;OSI适用于各种协议栈,TCP/IP只适用于TCP/IP网络;层次数量不同。原创 2024-07-12 11:59:52 · 701 阅读 · 0 评论 -
Android C++系列:Linux守护进程
本文介绍了守护进程的概念,守护进程的编程步骤,代码实现,以及守护进程的作用。帮助我们理解后台程序的运行原理等。原创 2024-07-11 17:37:40 · 641 阅读 · 0 评论 -
Android C++系列:Linux进程间通信(二)
本文介绍了mmap函数:mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存 地址,对文件的读写可以直接用指针来做而不需要read/write函数。原创 2024-07-11 17:36:47 · 333 阅读 · 0 评论 -
Android C++系列:Linux进程间通信(一)
本文介绍了Linux进程通信的概念:解决任何一个进程的全局变量在另一个进程中都看不到的问题,以及最常用的进程同行机制:管道。原创 2024-07-10 07:49:10 · 931 阅读 · 0 评论 -
Android C++系列:Linux进程间关系
本文介绍了linux终端的进程知识,本地终端、网络终端的虚拟终端原理;进程组概念getpgid、getpgrp;进程会话概念setsid等。原创 2024-07-10 07:47:31 · 939 阅读 · 0 评论 -
Android C++系列:Linux进程(三)
本文介绍了僵尸进程和孤儿进程的概念解决方案。僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程;孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号 进程init进程,称为init进程领养孤儿进程。原创 2024-07-09 07:58:34 · 341 阅读 · 0 评论 -
Android C++系列:Linux进程(二)
本文介绍了进程原语:fork和exec。fork调用一次返回两次:父进程中返回子进程ID;子进程中返回0;读时共享,写时复制。原创 2024-07-09 07:57:29 · 640 阅读 · 0 评论 -
Android C++系列:Linux进程(一)
我们知道一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多 个终端窗口运行/bin/bash,另一方面,一个进程在调用exec前后也可以分别执行两个不同 的程序,例如在Shell提示符下输入命令ls,首先fork创建子进程,这时子进程仍在执行/ bin/bash程序,然后子进程调用exec执行新的程序/bin/ls。按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划 线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。原创 2024-07-08 14:32:09 · 878 阅读 · 0 评论 -
Android C++系列:Linux常用函数和工具
本文介绍了Linux常用命令工具及函数:文件访问时间函数、cpu使用时间函数、ifconfig、netstat、设置IP方式等。原创 2024-07-08 14:30:38 · 1189 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(四)多路IO转接服务器
本文介绍了Linux多路复用的三种技术:select、poll、epoll。原创 2024-07-07 06:07:40 · 400 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(三)CS模型示例
本文分别介绍了基于TCP和UDP的客户端和服务器的开发流程及对应实现。原创 2024-07-07 06:06:33 · 620 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(二)网络套接字函数
本文介绍了网络套接字函数:socket、bind、listen、accept、connect等。原创 2024-07-06 16:25:58 · 771 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(一)预备知识
本文介绍了网络字节序概念以及字节序转换C函数、IP地址转换函数、sockaddr数据结构等。原创 2024-07-06 16:20:22 · 661 阅读 · 0 评论 -
Android C++系列:NDK减少so库体积方法总结
本文介绍了删除无用模块,平台能力替代第三方库,使用strip,设置编译器优化的flag,使用gc-sections去除没有用到的函数,设置可见性,去除iostream等有助于动态库体积优化的方法。原创 2024-07-05 00:20:05 · 342 阅读 · 0 评论 -
Android C++系列:JNI中的Handler--ALooper
本文回顾了Android 传统Handler机制,以及在JNI中实现Looper和JNI提供的ALooper的使用方式和技巧:使用管道来实现线程通信,并通过自定义通信协议来解决粘包问题。原创 2024-07-05 00:18:30 · 266 阅读 · 0 评论 -
Android C++系列:JNI中的线程操作
本文介绍了通过C语言创建线程的方法和C层等待线程返回的方法,以及JNI提供的AttachCurrentThread 和 DetachCurrentThread方法,通过该方法将C线程附着到Java虚拟机,同时我们还介绍了JNI_OnLoad方法和JavaVM结构。原创 2024-07-04 00:47:44 · 876 阅读 · 0 评论 -
Android C++系列:JNI引用管理
局部引用全局引用弱全局引用本文介绍了JNI层的引用类型和引用管理。JNI层主要提供了对标Java强应用的局部引用和全局引用以及对标Java弱引用的全局弱引用。对于全局引用一定要切记用完时Delete;局部引用要注意循环时找好实际实时删除避免浪费内存空间,如果一个方法内局部引用太多,试试EnsureLocalCapacity;一定要谨慎管理引用,避免内存泄露和野指针,空指针问题。原创 2024-07-04 00:44:03 · 707 阅读 · 0 评论 -
Android C++系列:JNI开发准则
(在 C++ 版本中,它们是一些类,这些类具有指向函数表的指针,并具有通过该函数表间接调用的 JNI 函数的成员函数。**在原生方法返回后,即使对象本身继续存在,该引用也无效。只有在与 ClassLoader 关联的所有类可以进行垃圾回收时,系统才会卸载类,这种情况很少见,但在 Android 中并非不可能。第一次找到我们的直接指针时,该方法会报告我们的引用类型正好是要检查的类型。会使用与 Java 堆栈顶部的方法相关联的类加载器,如果没有(因为调用来自刚刚附加的原生线程),则会使用“系统”类加载器。原创 2024-07-03 00:24:59 · 1079 阅读 · 0 评论 -
Android C++系列:JNI调用时的异常处理
对于在 Native 中发生了异常,需要让 Java 层去处理了,则在 Native 中抛出对应的异常,由 Java 层去捕获,比如在使用 ExceptionClear 清除了异常之后,就可以通过 throwNew 来抛出异常信息。不过,我们这样仅仅是消除了这次异常,还应该让调用者有异常的发生,那么就需要通过 Native 来抛出一个异常告诉 Java 调用者了。这样就把由 Native 调用 Java 时的一个异常进行了处理,当处理完异常之后,别忘了释放对应的资源。根据异常类型和异常信息来抛出异常。原创 2024-07-03 00:23:48 · 377 阅读 · 0 评论 -
Android C++系列:JNI调用 Java 类的构造方法和父类的方法
Android JNI开发时经常遇到C/C++层访问Java层对象的,比如C/C++层创建一个String返回,或者访问Java层提供的MediaCodec等,此时我们就需要通过 JNI 来调用 Java 一个类的构造方法来创建这个 Java 类。原创 2024-07-02 00:36:16 · 846 阅读 · 1 评论 -
Android C++系列:JNI常见问题
_atomic_*本文介绍了JNI开发过程中常见的问题,比如版本问题,定位符号失败问题以及不同平台函数实现的差异等。后续可以持续维护迭代本文档。原创 2024-07-02 00:35:23 · 1414 阅读 · 0 评论 -
Android C++系列:JNI操作Bitmap
本文介绍了Android Bitmap相关知识,以及在JNI层操纵Bitmap:检索Bitmap对象信息、访问原生像素缓存等,并介绍了JNI层旋转、镜像Bitmap的操作实战。原创 2024-07-01 10:04:06 · 1433 阅读 · 0 评论 -
Android C++系列:JNI 调用时缓存字段和方法 ID
之前分享的JNI操作是基础,基于应用到实战中就要讲究各种技巧,用以提升效率。本文提到JNI调用时字段和方法ID缓存其实最终的方案还是以初始化时缓存为主,是在实际开发中总结出来的。创建编码器;循环调用编码器编码方法,输入pcm数据,输出编码后音频数据;释放编码器。这里面就可以把创建编码器充当初始化方法来获取编码方法的方法id等。原创 2024-07-01 09:59:04 · 485 阅读 · 0 评论 -
Android C++系列:C++与Gradle结合
如果Android工程有第三方so库,并且jni编译后使用下面的cmake指定输出目录到 jniLibs下,有可能会发生 so库重复的错误。每次生成的so所在的目录不是在 jniLibs下,虽然知道如果打包,会将它打包进去,但就是觉得看不见它,想提供给别人用,还要去某个目录找。生成多个so这样就会先去跑到子目录下的 one 和 two 的CmakeLists.txt,执行成功再返回。最后生成了以下两个so文件,并自动按照abi分别放置在了 jniLibs下。原创 2024-06-30 10:06:51 · 407 阅读 · 0 评论 -
Android C++系列:通过 JNI 访问 Java 字段和方法调用
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系。有了之前那些基础,就可以实现 Java 和 Native 的相互调用了,在 Native 中去访问 Java 类的字段并调用相应的方法。原创 2024-06-30 10:05:39 · 909 阅读 · 0 评论