Android-JNI1

  1. JNI:Java Native Inteface 。java本地接口
    • #include  <stdio.h>:相当于java的import,作用导入c语言的输入输出包
    • #include  <stdlib.h>:导入常用的函数库。
    • system("pause"); 可以执行命令行中的命令
      • pause表示暂停执行;shutdown  -s  -t 60,表示重启电脑
  2. 基本数据类型
    • java和c语言的8大基本数据类型表示形式
    •   char long
      boolean 
      byte  short int float double
      java语言 占2字节 占8字节 占1字节 占1字节 占2字节 占4字节 占4字节 占8字节
      c语言 占1字节 占4字节 0=false,1=true  -- 占2 占4 占4 占8
      c中表示String类型可用:
      • char数组:char str[20] = "heima 15";  或者 char  cc[20]={'h','e','y',};
      • 指针:char*  cc = "heima 15";
    • sizeof( ):接一个数据类型,返回指定数据类型占用的字节数
  3. 输入输出函数:输入输出类型要一致
    • 输出:对应的占位符与数据类型
      • %d %ld %f %lf %c %#x %o %s
        int long float double char 十六进 0x 制输出 八进制输出 字符串输出
    • 输入:
      • scanf( " " ,  &len ); 接收键盘输入的数据
      •  //参数1: 指定接收的数据的数据类型
      •  //参数2: 指定接收的数据存放的位置 
  4. 指针和指针变量
    • 指针:就是地址,地址是内存单元的编号,例如1000H。
    • 指针变量:存放地址的变量。
      • int*  p  = & i :p为存放地址的指针变量,&为取地址值符号。
      • *p:取出p存储的内存地址对应的值
      • &p:取指针p的地址值
      • p:变量p本身的内存地址值
    • 指针的重要性:
      • 直接访问硬件(opengl)
      • 快速传递数据
      • 返回一个以上的值
      • 表示复杂的数据结构
      • 指针表示字符串:   
        • char*  str = "hello world!!!";  printf("str=%s\n",str);
      • 指针有助于理解面向对象
  5. 指针常见错误。
    • 指针未经赋值不能使用。
      •  int * p;   printf("不能直接使用未赋值的指针:%#x\n",p);  //报错
    • 不同类型数据的指针不能相互转换。
      • double d = 3.1415;   int*  p = &d;  //类型不能转换
    • (**)函数的变量(静态)不能够跨函数访问,失去了函数变量的访问范围(生命周期)
      • int** p =  (&(&i))
  6. 传值和传引用
    • 传值:传递的是局部变量,方法结束后,局部变量被系统回收了。
    • 传引用:传递的是地址值,操作的是内存地址值。
二、
  1. 堆和栈的关系
    • #define  PI  3.1415  宏定义
    • 方法区:存放所有的方法
    • 栈空间:是一块连续的内存空间,执行速度快
    • 堆空间:是一块不连续的空间,执行速度稍慢
  2. 指针和数组的关系:
    • 数组是内存中一块连续的空间,数组名是数组中第一个元素的地址。
    • c语言中:数组的长度不会检查,循环变量不可以声明在for循环中
      • void printarr(int* p){
      •      int i;
      •      for(i=0;i<6;i++){
      •         printf("arr[%d]= %d\n",i,*(p+i));  
      •      }
      • }
      • main(){
      •        int arr[] = {12,65,64,23,75,23};   
      •        printarr(arr);
      •        system("pause");
      • }
    • 指针的运算:指针运算只有在连续的内存空间(数组)才有意义。
      •  int i;
      •      for( i = 0 ; i < 5; i++){
      •              printf("arr[ %d ]= %d\n", i, *(arr+i));
      •      }
  3. 指针占的字节长度:4,和操作系统有关。
  4. 动态和静态内存的分配:
    • 静态内存:系统在运行代码时,自动分配内存空间。
      • 例:方法中定义的变量,子函数里面定义的形参都是静态内存分配的变量,当子函数执行完毕后,系统会自动释放掉静态内存空间,程序员不能控制静态内存.
    • 动态内存: malloc(sizeof(int)) 申请一块内存空间
    • int* p = malloc( sizeof(int) ) :程序员动态的申请内存
      • 导入malloc包
      • 接收一个int类型的参数,参数的意义是 申请多少个byte控件的内存。
      • 返回申请空间的首地址。
    • free( p ):动态申请了内存后应该手工释放。接收的参数是内存地址值。
      • //通知操作系统,刚才申请的空间可以被重新使用了。
    •  int* p = malloc(sizeof(int));
    •     *p = 4;
    •     printf(" p = %d\n",*p); 
    •     free(p);  
    •     printf(" p = %d\n",*p); 
  1. 动态内存和静态内存的比较

    静态内存是系统是程序编译执行后系统自动分配,由系统自动释放,静态内存是栈分配的.动态内存是堆分配的.

  2. 动态内存分配,realloc()
    •  int* arr =(int* ) malloc(sizeof(int)*len) ; //动态申请的内存 
    • arr = realloc( arr, (len+increase)*sizeof(int) ); //可变长度
  3. 多级指针: int**** p 
  4. 函数的指针
    • int add(int x,int y){
    •    return x+y; 
    • }
    • main(){
    •        int (*pf)(int x,int y);
    •        pf = add;   //类型要保证一致
    •        printf("result=%d\n",pf(11,22));
  5. 结构体,Union联合体
    • 结构体:长度为结构元素个数*4的和,但编译器不同,长度可能会不同。
      • struct  Student  stu = {10001,88,'F'};  
      • stu.number;   stu.score;
    • 联合体:长度与最长的数据相同
    • typedef  int  haha:haha为int类型的别名。使用时可以  haha  i = 8;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值