一、什麼是NDK?
Native Development Kit (本地開發工具包);
NDK中提供了一系列的工具,幫助我們快速開發C/C++的動态庫,并能自動将so檔案和java檔案一起打包成apk;
作用是讓java代碼調用C和C++代碼;
二、什麼是JNI?
Java Native Interface (java 本地化接口);
是java調用C/C++的一套編碼規範;
NDK是基于JNI編碼規範進行編寫的;
三、為什麼使用NDK?
安全(代碼的保護,由于apk的java層代碼很容易被反編譯,而C/C++庫反編譯難度較大);
硬體方面: java不能直接通路硬體 圖像處理方面C和C++比java處理的速度和性能都要好很多;
便于移植:可以跨語言、跨平台;
借助了C/C++優秀第三方開源庫,比如openGL openCV;
四、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語言入口
五、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