C语言的基础

what 什么是JNI

  • JNI java native interface native本地 java本地接口
  • 通过JNI可以实现java和本地代码之间相互调用
  • jni可以看做是翻译 实际上就是一套协议

![V3$NMB)JUZE4]FJ%{ZRMWF6.png](http://upload-images.jianshu.io/upload_images/2648920-7dd5da93dae5c679.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

why 为什么要用JNI

  • Java 一处编译到处运行
    • ①java运行在虚拟机上 JNI可以扩展java虚拟机的能力 让java代码可以调用驱动
    • ②java是解释型语言 运行效率相对较低 C/C++的效率要高很多 通过jni把耗时操作方法C/C++可以提高java运行效率
    • ③ java代码编译成的.class 文件安全性较差, 可以通过jni 把重要的业务逻辑放到c/c++去实现,c/c++反编译比较困难 安全性较高
  • C历史悠久 1972年C 通过JNI可以调用优秀的C开源类库

why 为什么要用JNI

  • Java 一处编译到处运行
    • ①java运行在虚拟机上 JNI可以扩展java虚拟机的能力 让java代码可以调用驱动
    • ②java是解释型语言 运行效率相对较低 C/C++的效率要高很多 通过jni把耗时操作方法C/C++可以提高java运行效率
    • ③ java代码编译成的.class 文件安全性较差, 可以通过jni 把重要的业务逻辑放到c/c++去实现,c/c++反编译比较困难 安全性较高
  • C历史悠久 1972年C 通过JNI可以调用优秀的C开源类库

How 怎么用JNI

  • java
  • c/c++ 能看懂,会调用
  • JNI开发流程 NDK

c 的helloworld

    #include<stdio.h>    // 相当于 java的import .h c的头文件 stdio.h standard io 标准输入输出 
    #include<stdlib.h>   // stdlib standard library 标准函数库    java.lang 
    /**
    *函数的入口
    */
    main(){    // public static void main(String[] args)
           printf("helloworld!\n");  //System.out.println();   "\n"换行符 
           system("javac Hello.java");
           system("java Hello");
           system("notepad");
           system("pause"); //system执行windows的系统命令 ,让控制台暂停 
           } 

C的基本数据类型

* java基本数据类型
boolean  1   
byte     1
char     2         char    1个字节
short    2         short   2 
int      4         int     4
long     8         long    4
float    4        float    4
double   8        double   8

*c  的基本数据类型
char, int, float, double, long, short, signed, unsigned, void
* signed 有符号数 最高位是符号位 可以表示负数 但是表示的最大值相对要小 
* unsigned 无符号数 最高位是数值位 不可以表示负数  表示的最大值相对要大
* signed unsigned 只能用来修饰整形变量 char short int long
* C没有 boolean  byte C用0和非0表示false true
FQPTPBP)`%GJ7C0TPORX_%V.png

C的输出函数

%d  -  int
%ld – long int
%lld - long long
%hd – 短整型
%c  - char
%f -  float
%lf – double
%u – 无符号数
%x – 十六进制输出 int 或者long int 或者short int
%o -  八进制输出
%s – 字符串
  • 占位符不要乱用 要选择正确的对应类型 否则可能会损失精度
  • C字符串
    • C没有String类型 C的字符串实际就是字符数组
    • C数组定义 [ ]只能再变量名之后
    • C字符串两种定义方式
        char str[] = {'h','e','l','l','o','\0'};//注意'\0'字符串结束符
        char str[] = "你好"; //这种定义方式不用写结束符 可以表示汉字       
        char *str="abcd";
  • 一个汉字是两个字节

C的输入函数

  • scanf("占位符", &地址);
  • & 取地址符
  • C字符串不检查下标越界 使用时要注意
#include<stdio.h>    
#include<stdlib.h>    
/**
scanf("占位符",内存地址) 
*/
main(){    
      printf("请输入班级的人数:");
      
      int count;
      scanf("%d", &count); //&取地址符 
      printf("班级的人数是%d\n",count);
      char cArray[20];//c的数组不检测下标越界 
      printf("请输入班级的名字:");
      scanf("%s",&cArray);
      printf("班级的人数是%d,班级的名字%s\n",count,cArray);
      printf("count的地址%d\n",&count);
      printf("cArray的地址%d\n",&cArray);
       system("pause"); 
       } 

C字符串越界.png

内存地址的概念

  • 声明一个变量,就会立即为这个变量申请内存,一定会有一个对应的内存地址
  • 没有地址的内存是无法使用的
  • 内存的每一个字节都有一个对应的地址
  • 内存地址用一个16进制数来表示
  • 32位操作系统最大可以支持4G内存
    • 32位系统的地址总线为32位,也就是说系统有2^32个数字可以分配给内存作为地址使用
#include<stdio.h>    
#include<stdlib.h>    
/**
*/
main(){    
           //32位操作系统最大支持多大内存 32位地址总线  2^32  byte 4G 
       int i = 123;
       system("pause"); 
       } 

总线.png
实例
#include<stdio.h>    
#include<stdlib.h>    
/**

*/
main(){    
      int exp=0;//保存经验
      printf("开始打怪升级\n");
      while(1){
               printf("砍一刀,没砍死!\n");
               sleep(2000);
               printf("再砍一刀,砍死了 获得经验!\n");
                sleep(2000);
               exp += 20;
               if(exp>2000){
                          printf("恭喜您升级啦!\n");
                          break;
                          } 
               else{
                    printf("当前经验值%d,继续砍怪\n",exp);
                     sleep(2000);
                    }
               } 
       system("pause"); 
       } 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,401评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 清明时节雨纷纷,披着细密柔软的春雨,带着后院桃花胭脂般的粉红,田野旁油菜花甜蜜似的清香,还有三爸家院前榆钱...
    平仄人生阅读 887评论 0 3
  • 《超级能战队》里的大白,萌萌的说一句,这么做真的能改善你的情绪,令你心情愉悦么?你说是的,然后他就奋不顾身的勇往直...
    文艺女青年专治各种不服阅读 31,941评论 11 132