android JNI 开发技术 (C/C++基础篇)

android JNI 开发技术的使用,FrameWork层能够很好的和底层硬件结合,而硬件的操作基本使用C语言程序。所以在android开发的过程中,了解基础C语言,是很重要的一环。

C语言基础知识整理

一:我的第一个HelloWorld!

    //c++的头文件 
    #include   
    //C++中主要的类库 
    #include 
    //相当于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

}

八: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"); 
} 

你可能感兴趣的:(android,进阶之路)