jni数组使用(一)

 假设有这样一个java函数:

[java]  view plain copy
  1. public int Send(char buffer[],int length)  
这个函数需要调用c/c++函数

[cpp]  view plain copy
  1. 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的获取元素函数为:

[cpp]  view plain copy
  1. jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)  

对应的释放函数为:

[cpp]  view plain copy
  1. void ReleaseCharArrayElements(jcharArray array, jchar* elems,jint mode)  

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

[cpp]  view plain copy
  1. void GetCharArrayRegion(jcharArray array, jsize start, jsize len, jchar* buf)  

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

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

[cpp]  view plain copy
  1. static int jni_send  
  2.   (JNIEnv *env, jobject obj, jcharArray buffer, jint length)  
  3. {  
  4.     jchar *array;  
  5.     jboolean *buf;  
  6.     int i;  
  7.     int res;  
  8.   
  9.     LOGD("jni_radio_send");  
  10.     array = env->GetCharArrayElements( buffer, NULL);//复制数组元素到array内存空间  
  11.     if(array == NULL){  
  12.         LOGE("jni_radio_send: GetCharArrayElements error.");  
  13.         return 0;  
  14.     }  
  15.     buf = (jboolean *)calloc(length , sizeof(jboolean));//开辟jboolean类型的内存空间,jboolean对应的c++类型为unsigned char  
  16.     if(buf == NULL){  
  17.         LOGE("jni_radio_send: calloc error.");  
  18.         return 0;  
  19.     }  
  20.     for(i=0; i < length; i++){//把jcharArray的数据元素复制到buf所指的内存空间  
  21.         *(buf + i) = (jboolean)(*(array + i));  
  22.         //LOGD("buf[%d]=%c\n",i,*(buf+i));  
  23.     }  
  24.   
  25.     env->ReleaseCharArrayElements(buffer, array, 0);//释放资源  
  26.   
  27.     res = send(buf, length);//调用c++的send函数  
  28.       
  29.   
  30.     free(buf);//释放内存空间  
  31.     buf = NULL;  
  32.   
  33.       
  34.   
  35.     return res;  
  36.   
  37. }  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值