JNI的概念
Java Native Interface java本地接口
Native Native Language 本地语言 看操作系统使用什么语言开发的 那么这个语言就是本地语言
java c/c++ 通信的接口
Java 特点 一处编译到处运行 通过java虚拟机 把java代码和底层的操作系统隔离起来
c/c++ 平台相关性强
① java 想与硬件之间直接交互 不能直接交互 需要访问硬件的驱动 java需要调用C的代码
② java 运行的速度 比c要慢一些 高清视频回放 视频解码的库都是用c/c++去开发的
③ java 编译之后生成.class .class可以很容易的进行反编译 c编译之后生成机器码 机器码只能反汇编
金融软件
④ c语言有好多开源库 openCV ffmpeg vitamio
学习的目的 ①可以看懂android 所有的源码
② 有一些特定的需求 需要通过调用C去实现 需要使用JNI
Native c语言的基础 能看懂会调用
Interface NDK native develop kit
Java->C
c-> java
实际案例
printf("Hello World!\n");
c 基本数据类型
java的基本数据类型 C的基本数据类型
boolean 没有boolean 0 false 非0 true
byte 没有byte
printf("char类型占%d个字节\n", sizeof(char)); printf("short类型占%d个字节\n", sizeof(short)); printf("int类型占%d个字节\n", sizeof(int)); printf("long类型占%d个字节\n", sizeof(long)); printf("float类型占%d个字节\n", sizeof(float)); printf("double类型占%d个字节\n", sizeof(double)); int ii = 0; unsigned char cc = 256; printf("c = %d\n", cc);
signed和unsigned 可以用来修饰整形变量 short int long char
signed 有符号 默认情况下都是有符号的
unsigned 无符号 使用了unsigned 来修饰整形变量 这个整形变量的最高位就是数值位 不再是符号位
C 输出函数
00000000 10111100 01100001 01001110
01100001 01001110
使用占位符的时候 一定要注意 类型和占位符之间一定要一一对应 如果用错了可能会出现问题
C 数组的声明 [] 一定要放到变量名字的后面
char str[]
#include <stdlib.h> // include 包含 类似java 的import
#include <stdio.h> // .h head C的头文件 std standard 标准的 stdlib 标准函数库 stdio.h 标准输入输出流
/**
%d - int
%ld – long int
%lld - long long
%hd – 短整型 short
%c - char
%f - float
%lf – double
%u – 无符号数
%x – 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s – 字符串
*/
char c = 'a'; short s = 1234; int i = 12345678; long l = 1234567890; float f = 3.14; double d = 3.1415926; printf("c = %c\n", c); printf("s = %hd\n", s); printf("i = %d\n", i); printf("l = %ld\n", l); printf("f = %.2f\n", f); printf("d = %.7lf\n", d); printf("i = %#x\n", i); printf("i = %#o\n", i); char str[] = { 'a','b','c','d','e','\0' }; char str1[] = "你好"; printf("str =%s\n", str1);
//java 字符串 string c的字符串实际上就是字符的数组 字符数组结束的标记就是 '\0'
char str4[] = { 'a','b','c','d','e','\0' }; char str2[] = "abcde"; char *str3 = "你好"; printf("%s\n", str3); printf("%#x\n", str3);
C 输入函数
int count; printf("请输入班级的人数:"); scanf("%d", &count); printf("班级的人数为: %d\n", count); printf("count的地址:%d\n", &count); char name[2]; printf("name的地址:%d\n", &name); printf("请输入班级的名字:"); scanf("%s", &name); printf("班级的人数是:%d\n班级的名字是:%s\n", count, name);
内存地址的概念
内存的最小单位 byte 8位二进制数
内存要使用的时候 一定得对每一个byte进行编号 只有编号之后才能使用
32位系统 xp /win7 地址线32位 4G的内存
64位系统
C 的指针 ☆☆☆☆☆
int i1 = 456; int *p = &i1; printf("p =%#x\n", p); printf("i的地址:%#x\n", &i1); printf("*p = %d\n", *p); *p = 789; printf("i = %d\n", i1);
C指针的常见错误
double *p2 = &i1; printf("*p2 = %lf\n", *p2);
C 指针的练习
交换两个数的值
值传递 调用函数/方法的时候 传到方法中的是变量的值 值传递
引用传递 调用函数/方法的时候 传到方法中的也是数值 只不过这个值是一个地址值 引用传递
交换两个数
int i2 = 123; int j2 = 456; swap2(&i2, &j2); printf("i = %d,j = %d\n", i2, j2);
返回多个值
function(&i2, &j2); printf("i = %d,j = %d\n", i2, j2);
C 数组 和指针之间的关系
java的数组 是一块连续的内存空间
int array[] = { 1,2,3,4,15 }; printf("array[0]的地址%#x\n", &array[0]); printf("array[1]的地址%#x\n", &array[1]); printf("array[2]的地址%#x\n", &array[2]); printf("array[3]的地址%#x\n", &array[3]); printf("array[4]的地址%#x\n", &array[4]); printf("array的地址%#x\n", &array); double *p3 = &array; printf("array[0]的地址%d\n", *(p3 + 0)); printf("array[1]的地址%d\n", *(p3 + 1)); printf("array[2]的地址%d\n", *(p3 + 2)); printf("array[3]的地址%d\n", *(p3 + 3)); printf("array[4]的地址%d\n", *(p3 + 4)); printf("p+0的地址%d\n", p3 + 0); printf("p+1的地址%d\n", p3 + 1); printf("p+2的地址%d\n", p3 + 2); printf("p+3的地址%d\n", p3 + 3); printf("p+4的地址%d\n", p3 + 4);
C的字符串的最常用的声明方式
char str4[] = { 'a','b','c','d','e','\0' }; char str2[] = "abcde"; char *str3 = "你好"; printf("%s\n", str3); printf("%#x\n", str3);
C指针变量的长度
C 的多级指针
用2级指针保存1级指针的地址
用n级指针 保存 n-1级指针的地址
int *p7; double *p8; printf("int类型指针变量占%d个字节,double类型指针变量占%d个字节\n", sizeof(p7), sizeof(p8));
main函数中 获取子函数临时变量的地址
float *p9; function2(&p9); printf("p = %#x\n", p9);
静态内存分配和动态内存分配
静态内存分配 栈内存 大小固定 高地址向低地址扩展 栈内存的分配和回收是系统控制
int *p10 = function3(); function4(); printf("*(p+0) =%d,*(p+1) =%d,*(p+2) =%d,*(p+3) =%d,*(p+4) =%d\n", *(p + 0), *(p + 1), *(p + 2), *(p + 3), *(p + 4)); printf("*(p+0) =%d,*(p+1) =%d,*(p+2) =%d,*(p+3) =%d,*(p+4) =%d\n", *(p + 0), *(p + 1), *(p + 2), *(p + 3), *(p + 4));
C 的结构体☆☆☆☆☆
C 的联合体
C 的枚举
C 的自定义类型