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对象的像素缓存。

时间: 2025-01-07 06:46:59

Android C++高级编程的相关文章

Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》

这是我收集的关于android开发方面的经典书籍,高清PDF电子版,可以在我的百度网盘免费下载,希望对需要的朋友有帮助. 目录: <Android 4高级编程>(附完整源代码) <疯狂Android讲义> <Android应用开发详解(郭宏志)> <Android应用案例开发大全> <Android 3D游戏开发技术> <Android内核剖析 柯元旦> <深入理解Android  卷1> <深入理解Android

Android 4高级编程(第三版)Android简介

Android 部分组成: 一个兼容性定义文档(Compatibility Definition Document,CDD)和兼容性测试包(Compatibility Test Suite,CTS),它们描述了移动设备为了支持软件栈而需要具备的性能. 一个Linux操作系统内核 应用程序开发的开源库,包括SQLite Webkit OpenGL以及一个媒体管理器 用来运行和承载Android应用程序的运行时,包括Dalvik虚拟机和提供Android特定功能的核心库 一个把系统服务隐式地显示给应

《Hadoop高级编程——构建与实现大数据解决方案》有奖试读

一. 活动主题: <Hadoop高级编程--构建与实现大数据解决方案>有奖试读,点击查看图书详情 二. 活动时间: 2014年8月6日至2014年9月5日(为期1个月) 三. 参与方式 : 您可以选择下面任何一种方式来参加我们的活动! 1. 阅读我们精选的<Hadoop高级编程>试读章节(点击下载PDF文档),并将书评发布在本篇博客的评论区,每位用户可发表多一条或多条书评,书评优秀可重复获奖. 2. 将活动转发至新浪微博并关注@清华大学出版社第五事业部,或者关注官方微信@清华书友(

如何学习android高级编程

学了android高级编程有前途吗?进入2010年之后,android的应用开发进入了一个爆炸式增长的状态,从去年的不到1万款应用程序增加到现在的9万,而且即将突破10万,这也从开发者这一方面展现了用户不断增多的现象.不过需要注意的是,虽然数值的增长速度很快,开发公司还得做好相关的审查工作,尽快提高 android电子市场整体的应用质量,改善应用的盈利环境. 学了android高级编程有前途吗?随着高配置android手机的上市,全3D手机游戏也将会在更多的手机上运行,而android 2.2版

Android高级编程笔记(四)深入探讨Activity(转)

在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一般的Activity都占据了整个显示屏,但可以创建成半透明或二者浮动的Activity. 一.创建Activity 通过继承Activity类可以创建一个Activity窗口,基本框架如下: 1 public class MyActivity extends Activity { 2 @Overri

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #类级 #在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object #用于所有内建类的公共祖先 #展示一个名为distinctdict类的代码,与平常的dic

Linux C高级编程——网络编程基础(1)

Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括TCP .IP.UDP.ICMP等多种协议.下图是OSI模型与TCP/IP模型的对照.TCP/IP将网络划分为4层模型:应用层.传输层.网络层和网络接口层(有些书籍将其分为5层,即网络接口层由链路层和物理层组成) (1)网络接口层:模型的基层.负责数据帧的发送已接收(帧是独立的网络信息传输单元).网络