android JNI 開發技術 (C/C++基礎篇)

android JNI 開發技術的使用,FrameWork層能夠很好的和底層硬件結合,而硬件的操作基本使用C語言程序。所以在android開發的過程中,瞭解基礎C語言,是很重要的一環。

C語言基礎知識整理

一:我的第一個HelloWorld!

    //c++的頭文件 
    #include <stdio.h>  
    //C++中主要的類庫 
    #include <stdlib.h>
    //相當於java中的  public static void main(String strs[]){}  

    main(){ //函數開始 

    printf("Hello: wangxiaobo\n wang");//輸出打印函數 

    system("services.msc");

    system("mspaint"); 

    /*
    之前錯誤的理解爲:C語言不需要進行編譯,其實C也是需要編譯執行


    1:在dos 環境下,完全在c 語言中調用java代碼中的方法

        step1:將自己編譯好的java代碼路徑在window環境變量中的 CLASSPATH 中配置 

        setp2: 直接在C語言中進行 調用 

    */

    system("java Test"); 

    system("pause");//doc 執行命令  控制檯 console 停留 
    } 

    SUMMARY:使用簡單的C語言命令,可以操作相關係統的應用。

二:C語言基礎知識

    C基本數據類型    類型長度     C語言中對應的佔位符

    int              4            %d
    double           8            %lf
    float            4            %f
    long             4            %ld
    short            2            %sd
    char             1            %c
    void         
    signed           4
    unsigned         4

    C中沒有String,boolean類型,但是在c中對string佔位符爲  %s

    C中輸出內存地址的佔位符  %#x
    C中輸出16進制的佔位符    %o

    sizeof(int)函數:返回數據類型的長度

    對於小數位精度保留  %.2lf  表示對double類型的小數位保留兩位小數,默認四捨五入

三:C語言中的指針

指針:存儲內存地址。但是不要誤以爲指針本身不佔有內存空間,實際上指針本身也是佔有內存的
      不過它的存儲值爲內存

      int* pointer;

      *pointer :表示獲取指針對應內存地址存儲的值

      指針和指針變量的關係與區別

      可變

      具體的值

四:C語言中的數組

要點:數組是一塊連續的內存空間
      數組的內存地址與數組中首個元素的內存地址相同

對於數組而言:
char cArray[] = {'H','E','L','L','O'};
printf("取出相應的值:\n");
printf("cArray[0]==%c\n",cArray[0]); //數組取值
printf("查看cArray相應的內存地址:\n");
printf("&cArray[0]==%#x\n",&cArray[0]);//數組取址


//對於數組中取值與取址的新方法

printf("查看cArray相應的內存地址:\n");
int j;
for(j=0;j<5;j++){
        printf("cArray+%d==%#x\n",j,cArray+j);
} 

printf("查看cArray相應的值:\n");
for(j=0;j<5;j++){
        printf("cArray+%d==%c\n",j,*(cArray+j));
} 

五:C語言中的多級指針

int* p1;
int** p2;
int*** p3;
這種情況下的指針操作,說白了,也就是指針的地址間的相互轉化,調用

main(){
        //定義一個變量    
        int i = 100;

        printf("&i==%#x\n",&i);

        //address1指向地址爲i的地址 
        int* address1 = &i;

        printf("address1==%#x\n",address1);//地址 

        printf("&address1==%#x\n",&address1);// 對應地址的值的地址 

        //二級指針,地址的地址 
        int** address2 = &address1;

        printf("address2==%#x\n",address2);

        printf("&address2==%#x\n",&address2);

        //三級指針 
        int*** address3 = &address2; 
        printf("address3==%#x\n",address3);

        printf("&address3==%#x\n",&address3);

        int**** address4 = &address3;
        printf("address4==%#x\n",address4);

        printf("&address4==%#x\n",&address4);
        //指針取值 

        printf("****address4==%d\n",****address4);

        system("pause"); 
}

六:C靜態分配內存和動態分配內存

靜態分配內存:存在系統會在不定時的清理內存
動態分配內存:需要使用動態分配內存地址函數  malloc(int) 返回一個內存地址

    /*靜態分配內存地址*/
    void staticMemory(int** param){
        int i = 100;
        //指針前面+*  表示  指針對應內存地址的值 
        *param = &i;
    }



    /*動態分配內存地址*/

    void dynamicMemory(int** params){
        int i = 100;
        /*指針指的是內存地址,所以它的長度爲4*/
        int* pointer;
        /*動態分配地址的主要方法  malloc()*/
        pointer = (int*)malloc(sizeof(int)); //4,該方法返回的是一塊內存地址值,那麼使用指針來接收 
        *pointer = i;
        *params = pointer;
    } 


    main(){

        /*創建指針age 此時他本身是佔有內存空間的*/
        int* age;
        /*調用函數,進行地址分配*/ 
        staticMemory(&age);
        printf("*age==%d\n",*age);
        //靜態分配內存,在不確定的時間內系統會自動回收,這個如何控制,不知道 
        printf("*age==%d\n",*age);
        printf("*age==%d\n",*age);

        dynamicMemory(&age);

        printf("*age==%d\n",*age);
        printf("*age==%d\n",*age);
        printf("*age==%d\n",*age);

        system("pause");
    } 

七:動態分配數組內存地址

應用realloc(*_,int);方法,來重新分配內存

main(){
//輸入數組的長度   
printf("Please input Array length:\n");
int length;
scanf("%d",&length);
//提示 
printf("The Array length is :%d\n",length);
int* array = (int*)malloc(length*sizeof(int));
int i;
for(i = 0;i<length;i++){
    //提示用戶
    printf("Please input Array[%d] value\n",i);
    scanf("%d",array+i);//對對應的內存地址賦值 
}
printf("---------------------------------I want to realloc memory:--------------------------\n");
printf("please input the Array new length:\n"); 
int newLength;
scanf("%d",&newLength);
printf("The new Array length is : %d\n",newLength);
//重新分配內存空間的函數  realloc()
array = (int*)realloc(array,(length+newLength)*sizeof(int));

for(i = length;i<length+newLength;i++){
    //提示用戶
    printf("Please input Array[%d] value\n",i);
    scanf("%d",array+i);//對對應的內存地址賦值 
}

//打印出相應的數據
for(i=0;i<length+newLength;i++){
    printf("Array[%d]==%d\n",i,*(array+i));
} 

system("pause");

}

八:C函數指針

    /*定義一個小函數*/

    int add(int a,int b){
        return a+b;
    }

    main(){
        //定義函數指針,沒有方法體,括號中有*號 
        int (*func1)(int a,int b); 
        func1 = add;        
        int resule = func1(1,2);
        printf("resule==%d\n",resule);
        system("pause"); 
    } 

九:C聯合體(union)

/*
聯合體 Unition
所有的字段均使用同一塊內存空間,即長度爲4 
各個類型容易轉化 
*/

union Size{
    int small;//4
    int large;//4
    int middle;//4
}; 

main(){

    printf("union Size == %d\n",sizeof(union Size));
    /*
    union Size == 4
    請按任意鍵繼續. . .
    原因:所有的字段均使用同一塊內存空間,即長度爲4  
    */

    union Size s;

    s.large=10;
    s.middle = 5;
    s.small = 1;

    printf("Size.large==%d\n",s.large);
    printf("Size.middle==%d\n",s.middle);
    printf("Size.small==%d\n",s.small);
    //因爲其聯合體公用統一內存空間,所以修改值之後,對其中的值進行修改,其餘的獲得的值同樣被修改
    system("pause"); 
} 

十:C枚舉(enum)

/*  
枚舉默認的首元素是 0 
*/

/*enum 函數:默認從0開始,遞增*/
enum week{
    Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday
}

/*當將Sunday=1,的時候,獲取到的Saturday的值爲7*/

main(){

    //使用enum,必須先聲明
    enum week weeks = Sunday;

    printf("weeks==%d\n",weeks);

    system("pause"); 
} 

十一:typeof 別名 當數據類型很長,可以使用這個方式。自定義的類很長,可以使用

十二:結構體

問題:C中的結構體的長度爲  12 ,原因百度可查

/*
定義結構體
這樣的使用很類似於java中的POJO類 
*/
struct student{

    int age;//4
    float score;//4
    char sex;//1

}; 

main(){
    //使用結構體
    struct student stu = {18,98.9,'w'};
    printf("stu.age==%d\n",stu.age);
    printf("struct student length == %d\n",sizeof(struct student)); 
    system("pause"); 
} 

十三:結構體指針

/*
定義結構體
這樣的使用很類似於java中的POJO類 
*/
struct student{

    int age;//4
    float score;//4
    char sex;//1

}; 

main(){
    //使用結構體
    struct student stu = {18,98.9,'w'};

    struct student* stuPoint = &stu;

    /*等價*/
    printf("(*stuPoint).age == %d\n",(*stuPoint).age);
    printf("(*stuPoint).score == %.1f\n",stuPoint->score);

    /*重新賦值*/
    stuPoint->age =  20;
    printf("(*stuPoint).age == %d\n",(*stuPoint).age);
    system("pause"); 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章