Android C++系列:Linux进程间关系

7 月 10 日
阅读 5 分钟
157
在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进 程的控制终端(Controlling Terminal),在前面文章我们说过,控制终端是保存在PCB中的信 息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是 这个终端。默认情况下(没有重定向),每个进程的标准输入、标准...
封面图

Android C++系列:Linux进程(三)

7 月 9 日
阅读 3 分钟
147
wait/waitpid僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号 进程init进程,称为init进程领养孤儿进程 {代码...} < -1 回收指定进程组内的任意子进程-1 回收任意子进程0 回收和当前调用waitpid一个组的所有...
封面图

Android C++系列:Linux进程(二)

7 月 9 日
阅读 4 分钟
103
1. fork {代码...} 子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。 fork调用一次返回两次父进程中返回子进程ID子进程中返回0读时共享,写时复制 {代码...} 1.1 进程相关函数 {代码...} getpid/gteppid {代码...} getuid {代码...} getgidvfork用于fork后马上调用exec函数父子进程,共用同一地址空间,子...
封面图

Android C++系列:Linux进程(一)

7 月 8 日
阅读 3 分钟
200
我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信 息,Linux内核的进程控制块是task_struct结构体。现在我们全面了解一下其中都有哪 些信息。
封面图

Android C++系列:Linux常用函数和工具

7 月 8 日
阅读 2 分钟
153
如果times是非空指针,则存取时间和修改时间被设置为 times所指向的结构中的值。此 时,进程的有效用户ID必须等于该文件的所有者 ID,或者进程必须是一个超级用户进程。对 文件只具有写许可权是不够的
封面图

Android C++系列:Linux Socket编程(四)多路IO转接服务器

7 月 7 日
阅读 2 分钟
215
select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开 的文件描述符个数并不能改变select监听文件个数
封面图

Android C++系列:Linux Socket编程(三)CS模型示例

7 月 7 日
阅读 6 分钟
206
服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于 监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服 务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK 段,服务器收到后从accept()返回。
封面图

Android C++系列:Linux Socket编程(二)网络套接字函数

7 月 6 日
阅读 3 分钟
345
type:SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
封面图

Android C++系列:Linux Socket编程(一)预备知识

7 月 6 日
阅读 4 分钟
294
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区...
封面图

Android C++系列:NDK减少so库体积方法总结

7 月 5 日
阅读 3 分钟
296
基于亚马逊AVS Device SDK改造的全链路语音SDK最终编译的动态库有几十个,单架构动态库大小有几十兆,之前在Iot设备中勉强跑着,但是这个体积对于手机应用来说是致命的,各个模块费事费力能优化个几K的体积就不错了,我这直接给上个几十兆的,APP平台方肯定无法接受。但是一是有业务需求,二是自己又想把SDK推到手机APP...
封面图

Android C++系列:JNI中的Handler--ALooper

7 月 5 日
阅读 5 分钟
406
在Android中,UI线程是一个很重要的概念。我们在日常开发中对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。我们在子线程更新UI时最常用的手段就是Handler,Handler的主要原理:
封面图

Android C++系列:JNI中的线程操作

7 月 4 日
阅读 4 分钟
430
Java中创建线程三种方式:继承Thread类创建线程类;通过Runnable接口创建线程类;通过Callable和Future创建线程。Native 中支持的线程标准是 POSIX 线程,它定义了一套创建和操作线程的 API 。我们可以在 Native 代码中使用 POSIX 线程,就相当于使用一个库一样,首先需要包含这个库的头文件: {代码...} 这个头文件中定...
封面图

Android C++系列:JNI引用管理

7 月 4 日
阅读 8 分钟
245
在 Native 代码中有时候会接收 Java 传入的引用类型参数,有时候也会通过 NewObject 方法来创建一个 Java 的引用类型变量。在编写 Native 代码时,要注意这个代表 Java 数据结构类型的引用在使用时会被 GC 回收的可能性。
封面图

Android C++系列:JNI开发准则

7 月 3 日
阅读 14 分钟
549
JNI 定义了 Android 使用 Java 或 Kotlin 编程语言编的代码编译的字节码与原生代码(使用 C/C++ 编写)互动的方式。JNI 是一套标准的协议,不受硬件限制,支持从动态共享库加载代码,在一些情况对比直接使用Java高效。我们可以使用 Android Studio 3.2 及更高版本的内存性能剖析器中的 JNI 堆视图来查看全局 JNI 引用,...
封面图

Android C++系列:JNI调用时的异常处理

7 月 3 日
阅读 3 分钟
247
Native 代码自己抛出了一个异常让 Java 层去处理 可以看到异常的发生和处理基本都需要 Native 和 Java 交互,而对于 Native 自身出了异常,也就是 C/C++ 代码有问题,导致应用崩溃的又是另一回事了。
封面图

Android C++系列:JNI调用 Java 类的构造方法和父类的方法

7 月 2 日
阅读 5 分钟
323
Android JNI开发时经常遇到C/C++层访问Java层对象的,比如C/C++层创建一个String返回,或者访问Java层提供的MediaCodec等,此时我们就需要通过 JNI 来调用 Java 一个类的构造方法来创建这个 Java 类。
封面图

Android C++系列:JNI常见问题

7 月 2 日
阅读 19 分钟
367
智能语音交互SDK工程模块编译时指定的ANDROID_PLATFORM统一是23:-DANDROID_PLATFORM=23,ndk使用的是版本是17,在手上现有设备跑的都没问题,但是在一个新采购的temi移动机器人上跑不起来,定位到问题是信号处理库报了下面问题:
封面图

Android C++系列:JNI操作Bitmap

7 月 1 日
阅读 10 分钟
349
Bitmap代表一个位图,BitmapDrawable*里封装的图片就是一个 Bitmap对象。开发者为了把一个 Bitmap对象包装成 BitmapDrawable 对象,可以调用 BitmapDrawable的构造器:
封面图

Android C++系列:JNI 调用时缓存字段和方法 ID

7 月 1 日
阅读 3 分钟
230
通常我们通过 FindClass 、GetFieldID、GetMethodID 去找到对应的信息也是耗时操作,如果方法被频繁调用(特别是像音视频处理时循环的调用JNI方法传递音视频数据),每次都去查找对应的类和方法ID会很耗性能,所以我们必须将它们缓存起来,达到只创建一次,后面直接使用缓存内容的效果。
封面图

HarmonyOS原生智能,生而智能能力探索

6 月 30 日
阅读 6 分钟
385
今年六月份华为HDC开发者大会上有主题分享了华为HarmonyOS的原生智能能力,之前做过两点的端智能系统开发,最后也失败了,在“原生智能、生而智能”的分享中看到了几个应用的分享,本文探讨与OS深度结合后,AI能为开发者带来什么。
封面图

Android C++系列:C++与Gradle结合

6 月 30 日
阅读 3 分钟
227
如果Android工程有第三方so库,并且jni编译后使用下面的cmake指定输出目录到 jniLibs下,有可能会发生 so库重复的错误。请采用以下方法避免错误:
封面图

Android C++系列:通过 JNI 访问 Java 字段和方法调用

6 月 30 日
阅读 5 分钟
390
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型、字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系。
封面图

Android C++系列:访问Assets 文件夹

6 月 29 日
阅读 4 分钟
471
assets目录是Android的一种特殊目录,用于放置APP所需的固定文件,且该文件被打包到APK中时,不会被编码到二进制文件。 Android还存在一种放置在res下的raw目录,该目录与assets目录不同。 区别点:
封面图

Android C++系列:认识JNI

6 月 29 日
阅读 2 分钟
300
JNI不仅仅是Android特有的,它是属于Java平台的,它允许在Java虚拟机内运行的java代码与其他编程语言(如c, c++和汇编语言)编写的程序和库进行交互。Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是并不是说不能使用...
封面图

Tensorflow Lite移动平台编译

6 月 28 日
阅读 5 分钟
408
如果不做定制化操作,我们不需要自己编译TensorFlow Lite Android库。我们可以直接使用位于MavenCentral的TensorFlow Lite AAR。但是在某些情况下,我们需要本地编译TensorFlow Lite。例如,您可能正在构建一个包含operations selected from TensorFlow的自定义二进制文件,或者需要对TensorFlow Lite进行局部修改。

【Android 构建新工具】Bazel 构建Android项目

6 月 28 日
阅读 6 分钟
397
【Android 构建新工具】Bazel 构建Android项目本文我们使用Bazel构建一个最简单的Android项目。Bazel提供了编译Android程序内置的方法,具体参考:Android Rules1. 环境准备Bazel只是编译工具,不是真正的编译器,所以还是需要Andorid开发的SD、NDK以及Android Studio,并配置开发环境。接下来就是安装Bazel。由于平时在...
封面图

Bazel与Gradle工具差异

6 月 27 日
阅读 6 分钟
340
Bazel和Gradle强调构建体验的不同方面。在某种程度上,它们的侧重点是互斥的——Gradle对灵活性和非突出性的要求对它的构建结构进行了限制,而Bazel对可靠性和性能的要求产生了强制不可协商的限制。
封面图

Bazel构建工具介绍

6 月 27 日
阅读 2 分钟
312
Android开发我们主要用到的编译器是Java的Java编译器以及C/C++的gcc/clang编译器。对应Java层构建工具最初是Ant,后面Maven以及gradle;C/C++构建工具主要是make/cmake,做过系统开发或者chromeium,可能还用过ninjia、gclient、mm等。最近在编译Android平台的tensorflow lite库,发现官方使用的是Bazel构建工具,大概了...
封面图

Android C++系列:vector最佳实践

6 月 26 日
阅读 2 分钟
372
Java中常见的集合有List、Set、Map等,并且这些都是支持泛型的。类似的C++中也提供了vector容器,并且vector是模板类(类似Java的泛型)。使用vector要用到的头文件:
封面图

Android C++系列:string最佳实践二

6 月 26 日
阅读 1 分钟
669
这里涉及指针指向常量字符串时和使用常量内存初始化数组的区别。为了节省内存,C/C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。而用常量内存初始化数组,则会把常量字符串内容拷贝到数组开辟的内存。
封面图