分享

jni数组使用(一)

 盛夏流年闪耀 2013-07-30

 假设有这样一个java函数:

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

  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的获取元素函数为:

  1. jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)  

对应的释放函数为:

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

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

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

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

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

  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. }  

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





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多