Android C++高级编程
简介
《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化。本文将记录主要知识点。
详解
1、深入了解Android NDK
Android NDK不是一个独有的工具;它是一个包含API、交叉编译器、链接程序、调试器、构建工具、文档和实例应用程序的综合工具集。组件如下:
ARM、x86和MIPS交叉编译器
构建系统
JAVA原生接口头文件
C库
Math库
POSIX线程
最小的C++库
ZLib压缩库
动态链接库
Android日志库
Android像素缓冲区库
Android原生应用APIs
OpenGL ES 3D图形库
OpenSL ES 原生音频库
OpenMAX AL 最小支持
Android NDK结构:
ndk-build 构建系统的起点
ndk-gdb 用GUN调试器调试原生组件
ndk-stack 分析原生组件奔溃时的堆栈追踪
build 构建系统的所有模块
platforms 支持不同android目标版本的头文件和库文件
samples 实例
sources 共享模块
toolchains 支持不同目标机体系结构的交叉编译器
2、用JNI实现与原生代码通信
JNI是Java程序设计语言功能最强的特征,它允许Java类的某些方法原生实现,同时让它们能够像普通java方法一样被调用和使用。引用类型对原生方法是不透明的,它不能直接使用和修改,JNI提供了与这些引用类型密切相关的一组API,这些API通过JNIEnv接口指针提供给原生函数。
JNI支持unicode编码格式和utf-8编码格式的字符串。
原生NIO在缓冲管理区、大规模网络和文件I/O及字符集支持方面的性能有所改进,适合和JAVA程序之间传送大量数据。
JAVA有两类域:实例域和静态域,JNI提供了访问该两类域的方法。
局部引用不能在后续的调用中被缓存及重用,主要原因是他们的使用期限仅限于原生方法,一旦原生函数返回,局部引用即被释放。
全局引用在原生方法的后续调用过程中依然有效,除非它们被原生代码显示释放。
全局引用的另一类型是弱全局引用,与全局引用一样,弱全局引用在原生方法的后续调用过程中依然有效,与全局引用不同的是,弱全局引用并不阻止潜在的对象被垃圾收回。
只在原生方法执行期间及正在执行原生方法的线程环境下局部引用是有效的,局部引用不能在多线程间共享,只有全局引用可以被多个线程共享。
被传递给每个原生方法的JNIEnv接口指针在与方法调用相关的线程中也是有效的,它不能被其它线程缓存或使用。
3、日志、调式及故障处理
Android日志框架是logger的内核模块。日志消息由个部分组成:
Main 主要应用程序的日志信息
Event 系统事件
Radio Radio相关的日志信息
System 调试时产生的低级系统调式信息。
默认情况下,JNI函数基本不做错误检查。不过JNI提供了一个扩展的检测方式(CheckJNI),当激活该功能时,JavaVM和JNIEnv接口指针切换到函数表,这些函数表在调用实际的实现之前执行扩展错误检查,检查的问题如下:
企图分配负数大小的数组
将错误的指针或Null指针传递给JNI函数
传递类名称时语法错误
在临界区调用jni
给newdirectbyebuffer传递错误参数
当一个异常挂起时调用jni
用在错误的线程中的JNIEnv接口指针
域类型与Set<Type>Field函数不匹配
方法类型与Call<Type>Method函数不匹配
用错误的引用类型
错误的释放模式
从原生方法返回不兼容类型
无效的utf-8数列传递给jni调用
两种方法诊断内存问题:
1、使用lib调式模式
2、使用工具,Valgrind和strace内存分析工具
4、原生线程
线程是让单个进程并发执行多个任务的机制,它是共享同一个父进程的内存和资源的轻量级进程,一个进程可以包含多个并发执行的线程。
Android支持Java和原生代码中的线程。
POSIX线程简称Pthreads,是一个线程的POSIX标准。当线程结束,能返回一个结果。
POSIX线程同步机制:互斥锁、信号量。
POSIX线程调度策略:SCHED_FIFO、SCHED_RR。
5、Socket 编程
Android是基于Linux内核的,NDK提供的头文件基本都是 posix 协议的。
socket是一个连接的终点,它可以被命名和寻址以在相同机器或网络中不同机器上的应用程序之间传输数据。
通信分为:面向连接的通信、面向无连接的通信、本地通信。
6、图形API、音频API
Android框架提供了android.graphics.Bitmap类用来在Java代码中操作和使用bitmap像素缓存。
Android提供了JNI Graphics API 可以使用原生代码访问和操作Bitmap对象的像素缓存。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。