JNI的C基础整理

原创 2016年08月31日 09:40:06

C/C++ 指针

/**
*指针本身也是在栈中,当指针指向某一个变量的地址的时,p的值就是变量a的地址,*p就是变量a所在地址的值.
*
*/
int a=2;
int *p=&a;//将

指针为什么要有类型、指针与地址的区别、空指针、二级指针,指针运算、指针与数组

/**
*因为有不同类型的变量(如int,double,char等),所以要存在不同的指针类型,以防内存不足,丢失精度等问题,
例如 
*
*/
double a=2; //double类型是8字节
int *p=&a;//int类型的内存是4个字节,而double需要8个字节的内存,所以会报错.
/**
*二级指针,
*
*/
int a=4;
int *p=&a;//一级
int **p2=&p//二级指针 :p2上保存了&p得地址
**p2 = 90;//将p2的值,即p的指向的地址改为90
//通过指针给数组赋值

void main(){
    int uids[5];
    //高级写法
    //int i = 0;
    //for (; i < 5; i++){
    //  uids[i] = i;
    //}
    //早些版本的写法
    int* p = uids;
    printf("%#x\n",p);
    int i = 0; //i是数组元素的值
    for (; p < uids + 5; p++){
        *p = i;
        i++;
    }

    getchar();
}

指针与二维数组、函数指针,指针与二维数组、函数指针

//函数指针
//用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来
int* getMinPointer(int ids[], int len){
    int i = 0;  
    int* p = &ids[0];
    for (; i < len; i++){
        if (ids[i] < *p){           
            p = &ids[i];
        }
    }
    return p;
}

void main(){
    int ids[10];
    int i = 0;
    //初始化随机数发生器,设置种子,种子不一样,随机数才不一样
    //当前时间作为种子 有符号 int -xx - > +xx
    srand((unsigned)time(NULL));
    for (; i < 10; i++){
        //100范围内
        ids[i] = rand() % 100;
        printf("%d\n", ids[i]);
    }

    int* p = getMinPointer(ids, sizeof(ids) / sizeof(int));
    printf("%#x,%d\n",p,*p);
    getchar();
}

字符串相关函数

//在线API文档:
//http://www.kuqin.com/clib/string/strcpy.html
void main(void){
    char dest[50];
    char *a = "china";
    char *b = " is powerful!";
    strcpy(dest,a);
    strcat(dest,b);
    printf("%s\n",dest);

    system("pause");
}

结构体、联合体、枚举

1.结构体

//结构体是一种数据类型,把不同数据类型整合起来的一种自定义类型
struct Man{
char name[10];
int age;
}m1,m2,*Man_P;//m1,m2结构体变量名,*Man_p是结构体的指针变量

2.typedef 类型取别名

//2.不同情况下,使用不同的别名
//#if defined(__cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;

struct Man{
char name[10];
int age;
}m1,m2,*Man_P;//m1,m2结构体变量名,*Man_p是结构体的指针变量
//简写
typedef struct Woman{
    char name[20];
    int age;
} W, *WP;  //W 是woman结构体的别名, WP 是woman结构体指针的别名

3.结构体函数指针成员

typedef struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi)(char*);
}Girl;

//Girl结构体指针取别名GirlP
typedef Girl* GirlP;

void sayHi(char* text){
    MessageBoxA(0, text, "title", 0);
}

//改名
void rename(GirlP gp1){
    gp1->name = "Lily";
}

void main(){
    Girl g1 = { "Lucy", 18, sayHi };
    GirlP gp1 = &g1;
    gp1->sayHi("Byebye!");
    //传递指针,改名
    rename(gp1);

    getchar();
}

4.联合体

//联合体即共同体,不同类型的变量共用一段内存,而且任何时刻只有一个成员存在,节省内存
//联合体变量的大小=最大的成员所占的字节数
union Value{
    int x;
    int y;
    double z;

}

4.枚举(列举所有情况)

enum Day
{
    Monday = 0,
    Tuesday = 1,
    Wednesday = 2,
    Thursday = 3,
    Friday = 4,
    Saturday = 5,
    Sunday = 6
};

IO流

参考网 http://ganquan.info/standard-c/function/tmpnam

文件加密解密

//二进制文件加解密
//读取二进制文件中的数据时,一个一个字符读取
//密码:ilovely

void crpypt(char normal_path[], char crypt_path[],char password[]){
    //打开文件
    FILE *normal_fp = fopen(normal_path, "rb");
    FILE *crypt_fp = fopen(crypt_path, "wb");
    //一次读取一个字符
    int ch;
    int i = 0; //循环使用密码中的字母进行异或运算
    int pwd_len = strlen(password); //密码的长度
    while ((ch = fgetc(normal_fp)) != EOF){ //End of File
        //写入(异或运算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);
}

//解密
void decrpypt(char crypt_path[], char decrypt_path[],char password[]){
    //打开文件
    FILE *normal_fp = fopen(crypt_path, "rb");
    FILE *crypt_fp = fopen(decrypt_path, "wb");
    //一次读取一个字符
    int ch;
    int i = 0; //循环使用密码中的字母进行异或运算
    int pwd_len = strlen(password); //密码的长度
    while ((ch = fgetc(normal_fp)) != EOF){ //End of File
        //写入(异或运算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);

}

void main(){
    char *normal_path = "";
    char *crypt_path = "";
    char *decrypt_path = "";

    //crpypt(normal_path, crypt_path,"iloveqq");
    //解密
    decrpypt(crypt_path, decrypt_path,"iloveqq");

    getchar();
}

C部分总结

好久没写C的代码了,有些生疏.这几天把它捡起来,为JNI开发做准备.

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处http://blog.csdn.net/ccj659

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

android JNI 开发技术的使用,FrameWork层能够很好的和底层硬件结合,而硬件的操作基本使用C语言程序。所以在android开发的过程中,了解基础C语言,是很重要的一环。 C语言基础...
  • Wedfrend
  • Wedfrend
  • 2018年01月10日 09:56
  • 53

Android JNI编程(一)——JNI概念以及C语言Dev-C++开发环境搭建、编写HelloWorld

一:JNI是什么? JNI:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) ,简单来说就是Java调C,C调J...
  • a_zhon
  • a_zhon
  • 2016年11月21日 11:04
  • 927

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 10011

JNI基础(六)C调java代码

java如何调用C代码,大概已经了解了,通过是先本地方法来调用。那么C代码如何代用java代码 套路与思路:通过反射 java代码: public class MainActivity exte...
  • sinat_31311947
  • sinat_31311947
  • 2017年01月07日 19:34
  • 788

Android Studio开发jni实例详解 (调用C代码实例)

一、配置NDK环境 第一步:在AndroidStudio中配置ndk环境 需要下载ndk包,在AndroidStudio中File-->ProjectStructure-->SDK Locatio...
  • u013210543
  • u013210543
  • 2016年08月03日 17:12
  • 4712

html基础标签整理

标签分类 主体:文本:标题按照重要性从1到6表格:表单:链接:图像:列表:样式:背景:框架等等...
  • dreamer_meng
  • dreamer_meng
  • 2017年04月26日 11:33
  • 165

Android JNI-Native 基本类型对应关系

对于JNI-Native 基本类型,对应关系如下: 字符     Java类型     C/C++类型 V           void         void Z         jboole...
  • wangbaochu
  • wangbaochu
  • 2015年01月28日 16:10
  • 1584

NDK学习笔记:jni数据类型转换

随着Android项目中c++代码部分功能复杂程度的增加,jni中需要传递的数据类型也越来越多,关于jni数据类型转换网上有不少相关文章,但是在使用时发现这些例子中存在不少谬误,遂在此重新总结相关内容...
  • lidec
  • lidec
  • 2017年02月05日 15:27
  • 2971

【前端】HTML标签整理

HTML标签【一】 参考链接:http://www.w3school.com.cn/tags/ 【1】标签:告知浏览器,其自身是一个HTML文档 【2】标签:定义文档的头部,是所有...
  • u013107656
  • u013107656
  • 2016年10月09日 15:24
  • 402

JNI基础知识

JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着...
  • u013378580
  • u013378580
  • 2016年08月28日 21:20
  • 1744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI的C基础整理
举报原因:
原因补充:

(最多只允许输入30个字)