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

jni使用基础,java调用c

  • 2012年05月24日 18:16
  • 240KB
  • 下载

jni使用基础(九)之c调用java事例demo

1.Activity package com.devchina.ndk4; import android.app.Activity; import android.os.Bundle; impor...

jni使用基础(七)之java调用c事例Demo

1.界面: package com.devchina.ndk3; import android.app.Activity; import android.os.Bundle; import and...

JNI开发java与c的基础交互

本文主要介绍JNI开发中java与c进行如下所示的交互,代码中注释很详细,很好理解 JniDemo.c #include "com_example_barry_jnidemo_JniDem...
  • rankun1
  • rankun1
  • 2016年08月07日 13:23
  • 201

JNI基础(六)C调java代码

java如何调用C代码,大概已经了解了,通过是先本地方法来调用。那么C代码如何代用java代码 套路与思路:通过反射 java代码: public class MainActivity exte...

JNI学习之:C/C++基础知识学习

项目中要用到JNI开发相关知识,所以在网上和视屏上进行了相关学习,JNI目的是实现java与C/C++互通(相互调用实现我们想要的功能)。之前也看过C语言的书箱,但是久了没有用过,等于没看,遗忘的速度...
  • true100
  • true100
  • 2016年06月20日 10:47
  • 1149

Jni基础 (一)Java和c互调

由于c语言更接近底层,所以运行效率要比 Java快,所以Java开发当中会用到c语言开发一些核心库,一方面提高运行效率,一方面可以是代码保密性更好,不易于反编译。所以本节所讲内容都是Java和c之间最...

JNI基础(八)开辟C进程

这样慢慢的就体现出了jni的强大,它可以通过C做到许多java做不到的事情,比如开辟一个C进程,我们知道java进程随时都有可能被系统杀死,并且在java进程中开辟出的任何线程也会随之被杀死,所以有时...

Jni C/C++开发基础之基础聚集(Android、Java范畴)

本文介绍使用jni C/C++编程时需要了解的基础知识,包括jni调用java的相关方法、java 方法签名知识...

JNI_最简单的Java调用C/C++代码(自己整理)

JNI_最简单的Java调用C/C++代码 JNI_最简单的Java调用C/C++代码 JNI,是Java Native Interface的简称,中文是“Java本地调用”。通过这种技...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI的C基础整理
举报原因:
原因补充:

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