jni数组使用(二)

上一篇说到在java中调用c++函数中,如何使用jni数组。

下面谈一谈在回调中如何使用jni数组。

假如有一个java函数:

[cpp] view
plain
copy

  1. public void Receive(char buffer[],int length)  

我们需要在c++中调用这个函数,在jni中该如何实现数组的转换?(本篇不涉及jni的回调函数的实现机制)

实现如下:

[cpp] view
plain
copy

  1. static void receive_callback(unsigned char *buf, int len)  
  2. {  
  3.     int i;  
  4.         JNIEnv* env = AndroidRuntime::getJNIEnv();//外部函数,获得java环境变量  
  5.     jcharArray array = env->NewCharArray(len);//定义数据变量  
  6.     jchar *pArray ;  
  7.       
  8.     if(array == NULL){  
  9.         LOGE("receive_callback: NewCharArray error.");  
  10.         return;   
  11.     }  
  12.   
  13.     pArray = (jchar*)calloc(len, sizeof(jchar));//开辟jchar类型内存空间  
  14.     if(pArray == NULL){  
  15.         LOGE("receive_callback: calloc error.");  
  16.         return;   
  17.     }  
  18.   
  19.     //copy buffer to jchar array  
  20.     for(i = 0; i < len; i++)  
  21.     {  
  22.         *(pArray + i) = *(buf + i);//复制buf数据元素到pArray内存空间  
  23.     }  
  24.     //copy buffer to jcharArray  
  25.     env->SetCharArrayRegion(array,0,len,pArray);//复制pArray的jchar数据元素到jcharArray  
  26.     //invoke java callback method  
  27.        env->CallVoidMethod(mCallbacksObj, method_receive,array,len);//调用回调函数,method_receive = env->GetMethodID(clazz, "Receive", "([CI)V");  
  28.     //release resource  
  29.     env->DeleteLocalRef(array);  
  30.     free(pArray);  
  31.     pArray = NULL;  
  32.       
  33.     checkAndClearExceptionFromCallback(env, __FUNCTION__);//外部函数  
  34. }  
时间: 2024-11-01 06:18:55

jni数组使用(二)的相关文章

php打乱数组:二维数组和多维数组

php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 <?php function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) $random[$key] = $list[$key]; return $random

PHP实现一维数组转二维数组的方法

 这篇文章主要介绍了PHP实现一维数组转二维数组的方法,实例分析了php操作数组的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP实现一维数组转二维数组的方法.分享给大家供大家参考.具体实现方法如下:   1 2 3 4 5 6 7 8 9 10 11 <?php $asr[1] = array("a","b","c","d"); $asr[2] = array("a",

在java中一维数组和二维数组有什么区别吗?

问题描述 在java中一维数组和二维数组有什么区别吗? 求大神指点java中一维数组和二维数组的区别,为什么一位数组是一行 二维数组可以定义多行 解决方案 如图黑色的是一维数组红色的是二维数组一维数组用来存数据二维数组用来存一维数组 解决方案二: JAVA中一维数组和二维数组的定义一维数组及二维数组的用法java中arraylist和一维数组二维数组的转换 解决方案三: 一楼正解,一维和二维的区别就是线和面的区别,一维的数组你就可以通过一个下标来准确定位,而二维的就需要有两个就像坐标系一样,一维

link中如何颠倒一个二维数组?二维数组不支持revses吧?

问题描述 link中如何颠倒一个二维数组?二维数组不支持revses吧? link中如何颠倒一个二维数组?二维数组不支持revses吧? 解决方案 可以用select Enumerable.Range(0 arr.GetLength(1)).Select(x => Enumerable.Range(0 arr.GetLength(1)).Select(y => arr[x y]).Reverse().ToArray()).Reverse().ToArray(); 解决方案二: 长方形的矩阵有上

string-C#一维数组存入二维数组的其中一维

问题描述 C#一维数组存入二维数组的其中一维 我定义 int num=20000; string[,] str2=new str[20,num]; for(int i=0;i<20;i++) { string[] str1=new str1[num]; str1=GetData(i); //一维数组是动态变化中,我随时提取 <<?这里该怎么写,我要将str1放入str2[i, ]中,就是将20个一维数组组合成了二维数组,请求大神帮忙 } 解决方案 一维数组与二维数组黑马程序员-一维数组和

详解C++中的一维数组和二维数组_C 语言

C++一维数组 定义一维数组 定义一维数组的一般格式为:     类型标识符  数组名[常量表达式]; 例如: int a[10]; 它表示数组名为a,此数组为整型,有10个元素. 关于一维数组的几点说明: 1) 数组名定名规则和变量名相同,遵循标识符定名规则. 2) 用方括号括起来的常量表达式表示下标值,如下面的写法是合法的: int a[10]; int a[2*5]; int a[n*2]; //假设前面已定义了n为常变量 3) 常量表达式的值表示元素的个数,即数组长度.例如,在"int

js中一维数组和二位数组中的几个问题示例说明_基础知识

js中的数组,可以存放各种数据类型(数值,字串) js中的数组没有越界,当输出的数组下标越界了,会显示undefined. js中的数组是默认动态增长的 遍历数组的一种简单方式. for(var key in arr){ window.alert(key+"= "+arr[key]); } 在给一个空的二维数组赋值的时候出现的问题: var arr2=[]; arr2[1][1]=45;//js不支持这种赋值方法 解决方法: //在这之前需要初始化定义arr2有多少行. for(var

PHP实现一维数组转二维数组的方法_php技巧

本文实例讲述了PHP实现一维数组转二维数组的方法.分享给大家供大家参考.具体实现方法如下: <?php $asr[1] = array("a","b","c","d"); $asr[2] = array("a","b","c","d"); $asr[3] = array("a","b","c&

直观理解C语言中指向一位数组与二维数组的指针_C 语言

一维数组和指针:对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我们