書籍信息
作者:Onur Cinar著 於紅 佘建偉 馮艷紅 譯
定價:59.80元
印次:1-4
ISBN:9787302343011
出版日期:2014.01.01
印刷日期:2016.01.27
內容簡介
不管你是想將已經存在的原生代碼套用移植到Android平台上還是準備開始在Android平台上進行軟體開發,使用《Android C++高級編程——使用NDK》一書提供的技術可以構建更出色的套用。本書將展示構建性能更好的複雜原生套用的方法。
《AndroidC++高級編程——使用NDK》提供了Java原生接口(JNI)的概述、BionicAPI、POSIX執行緒和套接字、C++支持、原生圖形和聲音API以及NEON/SIMD最佳化,在一個遊戲套用案例的幫助下,你將學到很多關鍵技能。
主要內容
●使用JNI將原生代碼連線到Java中
●使用SWIG自動生成JNI代碼
●使用POSIX執行緒實現多執行緒套用
●使用POSIX套接字實現網路套用
●使用logging、GDB和Eclipse調試器進行調試
●使用Valgrind分析記憶體
●使用GProf測試套用性能
●使用NEON/SIMD最佳化代碼
●使用EclipseIDE開發原生代碼
《AndroidC++高級編程——使用NDK》提供了移植、開發以及利用Android平台上的C++和其他原生代碼所需要的知識和技能,以便於運行圖形化的高級套用和更複雜的原生套用。
圖書目錄
第1章Android平台上的C++入門 1
1.1MicrosoftWindows 1
1.1.1在Windows平台上下載並安裝JDK開發包 2
1.1.2在Windows平台上下載並安裝ApacheANT 5
1.1.3在Windows平台上下載並安裝AndroidSDK 7
1.1.4在Windows平台上下載並安裝Cygwin 8
1.1.5在Windows平台上下載並安裝AndroidNDK 11
1.1.6在Windows平台上下載並安裝Eclipse 13
1.2AppleMacOSX 14
1.2.1在Mac平台上安裝Xcode 14
1.2.2驗證Mac平台的Java開發包 15
1.2.3驗證Mac平台上的ApacheANT 15
1.2.4驗證GNUMake 16
1.2.5在Mac平台上下載並安裝AndroidSDK 16
1.2.6在Mac平台上下載並安裝AndroidNDK 18
1.2.7在Mac平台上下載並安裝Eclipse 19
1.3UbuntuLinux 20
1.3.1檢查GNUC庫版本 20
1.3.2激活在64位系統上支持32位的功能 21
1.3.3在Linux平台上下載並安裝Java開發工具包(JDK) 21
1.3.4在Linux平台上下載並安裝ApacheANT 22
1.3.5在Linux平台上下載並安裝GNUMake 22
1.3.6在Linux平台上下載並安裝AndroidSDK 23
1.3.7在Linux平台上下載並安裝AndroidNDK 24
1.3.8在Linux平台上下載並安裝Eclipse 25
1.4下載並安裝ADT 26
1.4.1安裝Android平台包 29
1.4.2配置模擬器 30
1.5小結 33
第2章深入了解AndroidNDK 35
2.1AndroidNDK提供的組件 35
2.2AndroidNDK的結構 36
2.3以一個示例開始 36
2.3.1指定AndroidNDK的位置 37
2.3.2導入示例項目 37
2.3.3向項目中添加原生支持 39
2.3.4運行項目 40
2.3.5用命令行對項目進行構建 41
2.3.6檢測AndroidNDK項目的結構 42
2.4構建系統 42
2.4.1Android.mk 43
2.4.2Application.mk 53
2.5使用NDK-Build腳本 54
2.6排除構建系統故障 55
2.7小結 56
第3章用JNI實現與原生代碼通信 57
3.1什麼是JNI 57
3.2以一個示例開始 57
3.2.1原生方法的聲明 58
3.2.2載入共享庫 58
3.2.3實現原生方法 59
3.3數據類型 64
3.3.1基本數據類型 64
3.3.2引用類型 64
3.4對引用數據類型的操作 65
3.4.1字元串操作 65
3.4.2數組操作 67
3.4.3NIO操作 68
3.4.4訪問域 69
3.4.5調用方法 71
3.4.6域和方法描述符 72
3.5異常處理 75
3.5.1捕獲異常 75
3.5.2拋出異常 75
3.6局部和全局引用 76
3.6.1局部引用 76
3.6.2全局引用 76
3.6.3弱全局引用 77
3.7執行緒 78
3.7.1同步 78
3.7.2原生執行緒 79
3.8小結 79
第4章使用SWIG自動生成JNI代碼 81
4.1什麼是SWIG 81
4.2安裝 82
4.2.1Windows平台上SWIG的安裝 82
4.2.2在MacOSX下安裝 83
4.2.3在UbuntuLinux下安裝 85
4.3通過示例程式試用SWIG 86
4.3.1接口檔案 86
4.3.2在命令行方式下調用SWIG 89
4.3.3將SWIG集成到Android構建過程中 90
4.3.4更新Activity 92
4.3.5執行應用程式 93
4.3.6剖析生成的代碼 93
4.4封裝C語言代碼 94
4.4.1全局變數 94
4.4.2常量 95
4.4.3隻讀變數 96
4.4.4枚舉 97
4.4.5結構體 100
4.4.6指針 101
4.5封裝C++代碼 101
4.5.1指針、引用和值 102
4.5.2默認參數 103
4.5.3重載函式 104
4.5.4類 104
4.6異常處理 106
4.7記憶體管理 107
4.8從原生代碼中調用Java 108
4.8.1異步通信 108
4.8.2啟用Directors 109
4.8.3啟用RTTI 109
4.8.4重寫回調方法 109
4.8.5更新HelloJniActivity 110
4.9小結 110
第5章 日誌、調試及故障處理 111
5.1 日誌 111
5.1.1 框架 111
5.1.2 原生日誌API 112
5.1.3 受控制的日誌 114
5.1.4 控制台日誌 118
5.2 調試 119
5.2.1 預備知識 119
5.2.2 調試會話建立 120
5.2.3 建立調試示例 121
5.2.4 啟動調試器 121
5.3 故障處理 126
5.3.1 堆疊跟蹤分析 127
5.3.2 對JNI的擴展檢查 128
5.3.3 記憶體問題 130
5.3.4 strace 133
5.4 小結 134
第6章 Bionic API入門 135
6.1 回顧標準庫 135
6.2 還有另一個C庫 136
6.2.1 二進制兼容性 136
6.2.2 提供了什麼 136
6.2.3 缺什麼 137
6.3 記憶體管理 137
6.3.1 記憶體分配 137
6.3.2 C語言的動態記憶體管理 138
6.3.3 C++的動態記憶體管理 139
6.4 標準檔案I/O 141
6.4.1 標準流 141
6.4.2 使用流I/O 141
6.4.3 打開流 142
6.4.4 寫入流 143
6.4.5 流的讀取 145
6.4.6 搜尋位置 148
6.4.7 錯誤檢查 149
6.4.8 關閉流 149
6.5 與進程互動 150
6.5.1 執行shell命令 150
6.5.2 與子進程通信 150
6.6 系統配置 151
6.6.1 通過名稱獲取系統屬性值 152
6.6.2 通過名稱獲取系統屬性 152
6.7 用戶和組 153
6.7.1 獲取應用程式用戶和組ID 153
6.7.2 獲取應用程式用戶名 154
6.8 進程間通信 154
6.9 小結 154
第7章 原生執行緒 155
7.1 創建執行緒示例項目 155
7.1.1 創建Android項目 155
7.1.2 添加原生支持 157
7.1.3 聲明字元串資源 157
7.1.4 創建簡單的用戶界面 157
7.1.5 實現Main Activity 159
7.1.6 生成C/C++頭檔案 162
7.1.7 實現原生函式 163
7.1.8 更新Android.mk構建腳本 165
7.2 Java 執行緒 165
7.2.1 修改示例應用程式使之能夠使用Java執行緒 165
7.2.2 執行Java Threads示例 166
7.2.3 原生代碼使用Java執行緒的優缺點 167
7.3 POSIX執行緒 168
7.3.1 在原生代碼中使用POSIX執行緒 168
7.3.2 用pthread_create創建執行緒 168
7.3.3 更新示例應用程式以使用POSIX執行緒 169
7.3.4 執行POSIX執行緒示例 174
7.4 從POSIX執行緒返回結果 174
7.5 POSIX執行緒同步 176
7.5.1 用互斥鎖同步POSIX執行緒 176
7.5.2 使用信號量同步POSIX執行緒 180
7.6 POSIX執行緒的優先權和調度策略 180
7.6.1 POSIX的執行緒調度策略 181
7.6.2 POSIX Thread優先權 181
7.7 小結 181
第8章POSIXSocketAPI:面向連線的通信 183
8.1EchoSocket示例套用 183
8.1.1EchoAndroid套用項目 184
8.1.2抽象echoactivity 184
8.1.3echo應用程式字元串資源 188
8.1.4原生echo模組 188
8.2用TCPsockets實現面向連線的通信 191
8.2.1EchoServerActivity的布局 192
8.2.2EchoServerActivity 193
8.2.3實現原生TCPServer 194
8.2.4Echo客戶端Activity布局 206
8.2.5Echo客戶端Activity 208
8.2.6實現原生TCP客戶端 210
8.2.7更新AndroidManifest 213
8.2.8運行TCPSockets示例 214
8.3小結 217
第9章POSIXSocketAPI:無連線的通信 219
9.1將UDPServer方法添加到
EchoServerActivity中 219
9.2實現原生UDPServer 220
9.2.1創建UDPSocket:socket 220
9.2.2從Socket接收數據報:recvfrom 221
9.2.3向Socket傳送數據報:sendto 223
9.2.4原生UDPServer方法 224
9.3將原生UDPClient方法加入
EchoClientActivity中 225
9.4實現原生UDPClient 226
9.5運行UDPSockets示例 228
9.5.1連通UDP的模擬器 228
9.5.2啟動EchoUDPClient 229
9.6小結 229
第10章POSIXSocketAPI:本地通信 231
10.1EchoLocalActivity布局 231
10.2EchoLocalActivity 232
10.3實現原生本地SocketServer 237
10.3.1創建本地Socket:socket 237
10.3.2將本地socket與Name綁定:bind 238
10.3.3接受本地Socket:accept 240
10.3.4原生本地SocketServer 240
10.4將本地EchoActivity添加到Manifest中 242
10.5運行本地Sockets示例 243
10.6異步I/O 243
10.7小結 244
第11章支持C++ 245
11.1支持的C++運行庫 245
11.1.1GAbi++C++運行庫 246
11.1.2STLportC++運行庫 246
11.1.3GNUSTLC++運行庫 246
11.2指定C++運行庫 246
11.3靜態運行庫與動態運行庫 247
11.4C++異常支持 247
11.5C++RTTI支持 248
11.6C++標準庫入門 249
11.6.1容器 249
11.6.2疊代器 250
11.6.3算法 251
11.7C++運行庫的執行緒安全 251
11.8C++運行庫調試模式 251
11.8.1GNUSTL調試模式 251
11.8.2STLport調試模式 252
11.9小結 253
第12章 原生圖形API 255
12.1 原生圖形API的可用性 255
12.2 創建一個AVI視頻播放器 256
12.2.1 將AVILib作為NDK的一個導入模組 256
12.2.2 創建AVI播放器Android應用程式 258
12.2.3 創建AVI Player的Main Activity 258
12.2.4 創建Abstract Player Activity 262
12.3 使用JNI圖形API進行渲染 269
12.3.1 啟用JNI Graphics API 269
12.3.2 使用JNI Graphics API 270
12.3.3 用Bitmap渲染來更新AVI Player 271
12.3.4 運行使用Bitmap渲染的AVI Player 278
12.4 使用OpenGL ES渲染 279
12.4.1 使用OpenGL ES API 279
12.4.2 啟用OpenGL ES 1.x API 279
12.4.3 啟用OpenGL ES 2.0 API 280
12.4.4 用OpenGL ES渲染來更新AVI Player 280
12.5 使用原生Window API進行渲染 290
12.5.1 啟用原生Window API 290
12.5.2 使用原生Window API 291
12.5.3 用原生window渲染器來更新AVI Player 293
12.5.4 EGL圖形庫 301
12.6 小結 301
第13章 原生音頻API 303
13.1 使用OpenSL ES API 303
13.1.1 與OpenSL ES標準的兼容性 304
13.1.2 音頻許可 304
13.2 創建WAVE音頻播放器 304
13.2.1 將WAVELib作為NDK導入模組 304
13.2.2 創建WAVE播放器Android應用程式 306
13.2.3 創建WAVE播放器主Activity 306
13.2.4 實現WAVE Aduio播放 310
13.3 運行WAVE Audio Player 327
13.4 小結 328
第14章 程式概要分析和NEON最佳化 329
14.1 用GNU Profiler度量性能 329
14.1.1 安裝Android NDK Profiler 329
14.1.2 啟用Android NDK Profiler 330
14.1.3 使用GNU Profiler分析gmon.out檔案 331
14.2 使用ARM NEON Intrinsics進行最佳化 332
14.2.1 ARM NEON技術概述 333
14.2.2 給AVI Player添加一個亮度過濾器 333
14.2.3 為AVI播放器啟用Android NDK Profiler 336
14.2.4 AVI Player程式概要分析 337
14.2.5 使用NEON Intrinsics最佳化Brightness Filter 338
14.3 自動向量化 342
14.3.1 啟用自動向量化 343
14.3.2 自動向量化問題的發現和排除 344
14.4 小結 344