1、什麼是NDK?html
Native Development Kit (本地開發工具包);java
NDK中提供了一系列的工具,幫助咱們快速開發C/C++的動態庫,並能自動將so文件和java文件一塊兒打包成apk;c++
做用是讓java代碼調用C和C++代碼;數組
2、什麼是JNI?安全
Java Native Interface (java 本地化接口);oracle
是java調用C/C++的一套編碼規範;工具
NDK是基於JNI編碼規範進行編寫的;性能
3、爲何使用NDK?開發工具
安全(代碼的保護,因爲apk的java層代碼很容易被反編譯,而C/C++庫反編譯難度較大);編碼
硬件方面: java不能直接訪問硬件 圖像處理方面C和C++比java處理的速度和性能都要好不少;
便於移植:能夠跨語言、跨平臺;
藉助了C/C++優秀第三方開源庫,好比openGL openCV;
4、NDK環境的搭建
1.環境搭建:
(1)電腦環境的熟悉(是64位仍是32位的);
(2)安裝對應的對應的JDK---http://www.oracle.com/technetwork/java/javase/downloads/index.html;
(3)安裝Android Studio
(4)下載Cmake LLDB(支持同步調試和調用運行的插件) NDK;
2.項目建立:
(1)新建項目勾選include c++ support的支持;
(2)異常處理的支持 exception support(支持異常處理);
(3)運行時類型信息的支持 runtime type information support
生成c++類的描述:
CMakeLists.txt: NDK項目的配置文件;
nvtive-lib.cpp: 所要調用的C++文件;.cpp是c++文件
stringFromJNI方法: c語言入口
5、C語言基礎知識:
1.基本數據類型(基本內置類型)
(1)整型:
短整型: short int 16bit 2個字節 無符號整型 0-65535
整型:int 16bit 2個字節
長整型: long int 32個字節
(2)浮點型:
單精度(float)只能保證6位有效數字;
雙精度 (double)至少保證10位有效數字;
長雙精度(long double) 至少保證10位有效數字,可是比double提供的精度更高;
(3)字符型
char 8bit
(4)布爾型(c++纔有)
bool 只有0表明false,非0即爲真(true)
C++標準規定了每一個算術類型的最小空間,可是不阻止編譯器使用更大的空間
2.構造類型
(1)枚舉類型(enum)
(2)數組類型
(3)結構體類型(struct)
(4)共用體類型(union)
(5)類類型(class)C++纔有
3.指針類型
4.引用類型
5.空類型(void)
類類型和引用類型是C++比c中新增長的類型
6.數組 由類型名、標識符和維數組成的複合數據類型,類型名規定了存放在數組中的元素的數據類型,維數指定數組中包含的元素個數。 (1)一維數組: 定義: 類型名 標識符[維數];int a1[3]; 引用:標識符[維數];元素下標從0開始的;a1[1] 初始化:能夠在定義的時候初始化(能夠不寫維數),也能夠在使用前初始化(定義時必須寫維數)維數在使用以前,必須是 固定的值(由於數組的長度是固定的) (2)二維數組: 定義:類型名 標識符[維數][維數]; 引用:標識符[維數][維數]; 初始化:二維數組的初始化會自動補0,若是提供了所有的元素,那麼定義時第一維能夠省略,但第二維不能省略; 7.預處理命令:(在代碼編輯以前處理的命令)在編譯期執行 預處理命令是C++統一規定的,可是它不是C++語言自己的組成部分,不能直接對它們進行編譯; (1)宏定義: #define 標識符 字符串 pc 3.1415 #define 宏名(參數表) 字符串 (2)條件編譯: #ifndef #ifdef: 標識符 當指定的標識符已經被#define命令定義過, 程序段1 則只編譯程序段1 #else 不然 程序段2 編譯程序段2 #endif 限定#ifdef命令的範圍 #if 表達式 表達式爲真時 程序段1 編譯程序段1 #else 不然 程序段2 編譯程序段2 #endif 結束#if命令 (3)文件包含: 一個文件將另外一個文件的所有內容包含進來 #include