jni数组使用(一)

 假设有这样一个java函数:

public int Send(char buffer[],int length)
这个函数需要调用c/c++函数

int send(unsigned char *buf, int len)

实现,那么用JNI该如何实现?


首先分析java的参数char buffer[ ],它在jni中的对应类型为jcharArray,说明从java传到jni的参数类型就是jcharArray。

jcharArray是一个jni数组类型,操作数组在jni中都有特定的函数,例如获取数据元素有:GetXXXArrayElements,XXX表示数据类型,可用如下数据类型替代:

jobjectArray;
jbooleanArray;
jbyteArray;
jcharArray;
jshortArray;
jintArray;
jlongArray;
jfloatArray;
jdoubleArray;

例如jcharArray的获取元素函数为:

jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)

对应的释放函数为:

 void ReleaseCharArrayElements(jcharArray array, jchar* elems,jint mode)

另外还有获取数组指定范围元素的函数为:

void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* buf)

获取到数据元素之后,还可以设置数据元素,对应的函数是Get/Set<Type>ArrayRegion

下面看看Java的send函数如何调用c++层的send函数:

static int jni_send
  (JNIEnv *env, jobject obj, jcharArray buffer, jint length)
{
	jchar *array;
	jboolean *buf;
	int i;
	int res;

	LOGD("jni_radio_send");
	array = env->GetCharArrayElements( buffer, NULL);//复制数组元素到array内存空间
	if(array == NULL){
		LOGE("jni_radio_send: GetCharArrayElements error.");
		return 0;
	}
	buf = (jboolean *)calloc(length , sizeof(jboolean));//开辟jboolean类型的内存空间,jboolean对应的c++类型为unsigned char
	if(buf == NULL){
		LOGE("jni_radio_send: calloc error.");
		return 0;
	}
	for(i=0; i < length; i++){//把jcharArray的数据元素复制到buf所指的内存空间
		*(buf + i) = (jboolean)(*(array + i));
		//LOGD("buf[%d]=%c\n",i,*(buf+i));
	}

	env->ReleaseCharArrayElements(buffer, array, 0);//释放资源

	res = send(buf, length);//调用c++的send函数
	

	free(buf);//释放内存空间
	buf = NULL;

	

	return res;

}

下一篇将介绍在回调函数中如何使用数组





  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值