天天看點

NDK以及C語言基礎文法(一)

        一、什麼是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中新增加的類型      
NDK以及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