您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-10 09:56 211 查看
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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息