JNI 简单语法

java——JNI———-C
JNI相当于是翻译,将java类型的数据翻译为c能够识别的类型和
将c类型的数据翻译为java能够识别的类型

1、JNI对基本数据类型的处理

基本数据类型里面的值都可以直接返回得到

基本数据类型有哪些:
也就是java的八大基本类型
byte short int long
float double
boolean char

示例:jint ==int

2、JNI对复杂类型数据类型的处理

复杂类型有哪些:

JNI 简单语法_第1张图片

这里只对其中比较常见的进行了处理,主要是字符串和数组两种
基本的操作样式
java——–jni———-c

在jni里面 通过env->New得到的类型是java的相关类型
通过env->Get得到的类型是c的相关类型

通过Get得到的c的相关类型 ,需要在得到数据之后Release掉

1)、对字符串的处理
java —-jni ——-c

JNIEXPORT void JNICALL Java_com_tjstudy_jnidemo_Jni_getString
        (JNIEnv * env, jclass jcs,jstring str){
    //1、jstring 转c
    // 将jstring类型的str转换为c能够识别的类型
    char *chars = (char *) env->GetStringUTFChars(str, JNI_FALSE);
    //这个chars c就能够使用了
    //释放资源
    env->ReleaseStringUTFChars(str,chars);




    //2、c转jstring
    jstring  jtr = env->NewStringUTF(chars);
}

demo:
场景,在android端写一段字符串,经过jni 返回 hello 这个字符串

JNIEXPORT jstring JNICALL Java_com_tjstudy_jnidemo_Jni_getbackString
        (JNIEnv *env, jclass jcs, jstring jstr) {
    //需要处理jstr 在jstr前面加上 hello
    //1、需要将其变成c的格式
    char *cstr = (char *) env->GetStringUTFChars(jstr, JNI_FALSE);
    char buf1[1024];
    //指针是指向某一个位置 这里将该位置设置为空 则表示该位置实质上是不存在的
    //简单来说 要存储值,就要有存储值得那个位置 这里没有指定位置 所以是错的
    //char *buf1 = NULL;
    sprintf(buf1, "hello %s", cstr);
    //memset(buf1, '0', 1024);
    env->ReleaseStringUTFChars(jstr, cstr);
    return env->NewStringUTF(buf1);
}

使用
env->GetStringUTFRegion(jstr, 0, len, buf + 7); 对字符串的操作

JNIEXPORT jstring JNICALL Java_com_tjstudy_jnidemo_Jni_getbackString
        (JNIEnv *env, jclass jcs, jstring jstr) {
    jsize len = env->GetStringLength(jstr);
    char buf[128] = {"hello 12"};
    //char *pBuf = buf+7;
    //*pBuf表示的是指针指向buf的第7个位置
    //也就是说 pBuf也是buf的一部分了 对pBuf的修改buf也会修改
    env->GetStringUTFRegion(jstr, 0, len, buf + 7);
    //将长度为len的jstr 复制到buf里面的第7个位置后面 可以直接写pBuf
    return env->NewStringUTF(buf);
}

2)、对数组的处理

JNIEXPORT jint JNICALL Java_com_tjstudy_jnidemo_Jni_sumArray
(JNIEnv *env, jclass jcs, jintArray jarray) {
        //需实现功能:计算数组里面的数值的和
        //jarray是java类型能够识别的 需要转换成c能够识别的数组
        //1、需要创建一个c的数组 大小和java的相同------获取java的数组的长度
        int j_len = env->GetArrayLength(jarray);
        //2、创建同等长度的数组
        //c要的是字节数
        jint *carray = (jint *) malloc(sizeof(jint) * j_len);
        //初始化缓冲区
        memset(carray,0,sizeof(jint)*j_len);//不知道为什么要 不要也正常
        //3、拷贝数组
        env->GetIntArrayRegion(jarray, 0, j_len, carray);
        int sum = 0;
        for (int i = 0; i < j_len; i++) {
        sum += i;
    }
    free(carray);
    return sum;
}

你可能感兴趣的:(jni)