• JNI由浅入深_5_基本类型应用


    1、基本类型应用

    对于JNI处理基本类型还是比较简单的,下面是Java代码:
    <span style="font-size:14px;"> public native int intMethod(int n);
    
     public native boolean booleanMethod(boolean bool);</span>
    上面的方法是在Java中写的,注意要加native关键字,这两个方法都比较简单,分别传入int ,boolean类型到jni中,经过处理返回。下面是jni的代码:
    <span style="font-size:14px;">JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intMethod(
    		JNIEnv * env, jobject obj, jint val) {
    	return val * val;
    }
    
    JNIEXPORT jboolean JNICALL Java_com_example_jniandroid_service_SimpleObject_booleanMethod(
    		JNIEnv * env, jobject obj, jboolean val) {
    	return !val;
    }</span>

    2、基本数据类型的数组应用

          2.1 c处理Java的int[],并返回该数组元素的总和。
    public native int intArrayMethod(int[] intArray);
    /**
     * 求数组的和,返回一个int类型
     */
    JNIEXPORT jint JNICALL Java_com_example_jniandroid_service_SimpleObject_intArrayMethod(
    		JNIEnv * env, jobject obj, jintArray array) {
    	int i, sum = 0;
    	//获取数组的长度
    	jsize len = (*env)->GetArrayLength(env, array);
    	//取得数组首地址的指针
    	jint *body = (*env)->GetIntArrayElements(env, array, 0);
    	for (i = 0; i < len; i++) {
    		//获取数组中的元素
    		sum += body[i];
    	}
    	//释放资源
    	(*env)->ReleaseIntArrayElements(env, array, body, 0);
    	LOGD("数组总和 =%d", sum);
    	return sum;
    }
    
    2.2 native方法返回一个int[].
    public native int[] receiverIntArray();
    对应的c签名
    /**
     * 返回Java的int[]类型
     */
    JNIEXPORT jintArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverIntArray(
    		JNIEnv * env, jobject obj) {
    	int i = 1;
    	jintArray array; //定义数组对象
    	array = (*env)->NewIntArray(env, 10);
    	for (; i <= 10; i++) {
    		//void SetIntArrayRegion(jintArray array, jsize start, jsize len,const jint *buf)//  len:为1
    		(*env)->SetIntArrayRegion(env, array, i - 1, 1, &i);
    	}
    	/* 获取数组对象的元素个数 */
    	int len = (*env)->GetArrayLength(env, array);
    	/* 获取数组中的所有元素 */
    	jint* elems = (*env)->GetIntArrayElements(env, array, 0);
    
    	for (i = 0; i < len; i++) {
    		LOGD("ELEMENT %d IS %d
    ", i, elems[i]);
    	}
    
    	return array;
    
    }

    3、JNI处理string类型和String数组

    	public native String stringMethod(String text);
    
    	public native String[] receiverStringArray(String val);
    下面是jni的实现,在c文件的前面声明数组长度 #define ARRAY_LENGTH 5 。第一个方法是将一个字符串中的每个字符转换成大写,第二方法返回一个String类型的数组。这里用到了FindClass方法,它主要根据类的包名找到该类的class,在通过new方法创建对象。
    JNIEXPORT jstring JNICALL Java_com_example_jniandroid_service_SimpleObject_stringMethod(
    		JNIEnv * env, jobject obj, jstring string) {
    	const char *str = (*env)->GetStringUTFChars(env, string, 0);
    	char cap[128];
    	//copy字符串
    	strcpy(cap, str);
    	(*env)->ReleaseStringUTFChars(env, string, str);
    	int i = 0;
    	for (i = 0; i < strlen(cap); i++) {
    		//转换成大写
    		*(cap + i) = (char) toupper(*(cap + i));
    	}
    	return (*env)->NewStringUTF(env, cap);
    
    }
    
    /**
     * 返回Java字符串数组
     */
    JNIEXPORT jobjectArray JNICALL Java_com_example_jniandroid_service_SimpleObject_receiverStringArray(
    		JNIEnv * env, jobject obj, jstring val) {
    	//FindClass找到Java中String这个类,返回jni的jclass对象
    	jclass objClass = (*env)->FindClass(env, "java/lang/String");
    	//NewObjectArray创建对象数组,第二个参数长度,第三个类型
    	jobjectArray texts = (*env)->NewObjectArray(env, (jsize) ARRAY_LENGTH,objClass, 0);
    	jstring jstr;
    	char* sa[] = { "Hello,", "world", "jni", "iii", "爱死你了" };
    	int i = 0;
    	for (; i < ARRAY_LENGTH; i++) {
    		//创建jstring并赋值,NewStringUTF()函数将C语言的字符串转换为jstring类型
    		jstr = (*env)->NewStringUTF(env, sa[i]);
    		//赋值
    		(*env)->SetObjectArrayElement(env, texts, i, jstr); //必须放入jstring
    	}
    	return texts;
    
    }






  • 相关阅读:
    linux中nc命令
    Centos6.5 安装zabbix3(收藏,非原创)
    紀念
    算法学习资源收集
    一道奇怪的求和题
    P5717 题解
    P1424 刷题记录
    P1888 题解
    P1422 刷题记录
    P1055 题解
  • 原文地址:https://www.cnblogs.com/lbangel/p/4335862.html
Copyright © 2020-2023  润新知