JNI由浅入深_5_基本类型应用 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

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

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:28

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\n", 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;

}

相关案例查看更多