注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android系列五复杂动态库之数组传递  

2013-03-28 21:25:14|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android系列五复杂动态库之数组传递

在函数的参数传递中,数组是最常见的,特别是JAVAC#这些没有指针的语言。那么如果将JAVA中的数组传递到JNI中怎么办呢,而且大家知道,JAVA中是进行值传递的,如果想把数组改变后回传又该怎么办呢:

首先说直接传递数组,整个过程如前不再重复:

JNIEXPORT jint JNICALL Java_com_example_mytestso_IrisLib_GetIntData 

(JNIEnv *env, jobject this,jobject obj,jbyteArray bArray)

{

      jsize iLen = (*env)->GetArrayLength(env,bArray);
     LOGIO("--------------------len is    %d",iLen);
     jbyte *bPointer = (*env)->GetByteArrayElements(env,bArray,0);
     (*env)->ReleaseByteArrayElements(env,bArray,bPointer,0);

     int count = 0;
     for (;count < iLen;count++)
     {
       jbyte t = bPointer[count];
      
     LOGIO("----*****------------sum value   %d", iLen);
     LOGIO("--------------------Index value   %d", count);
     }

 

//另外一种方法

//定义一个jint类型的buffer把原始的数组copy到这个buf中去

jint buf[]={0,0,0,0,0};

env->GetIntArrayRegion(bArray,0,length,buf);

for(i=0;i<length;i++){

            cout<<"buf["<<i<<"]="<<buf[i]<<endl;
           sum+=buf[i];

 

   Return 0;

}

 

其实还有很多用法,比如整体的两个数组拷贝,大家可以看JNI的资料。这里就不再展开了,以后遇到再在后续的系列中进行添加。

然后谈第二个问题,如果想把数组的数据返回去怎么,当然你可以将其做为一个返回值为来操作,但是还有另外一种方法就是用一个类将其封装起来:

Class ArrayData{

 Public byte [] dataArray;

}

那么

JNIEXPORT jint JNICALL Java_com_example_mytestso_IrisLib_GetIntData 

(JNIEnv *env, jobject this,jobject obj)

{

     jclass cls = (*env)->GetObjectClass(env,obj);
    if (cls)
    {

     jfieldID  fnumid  = (*env)->GetFieldID(env,cls," dataArray ","[B");
     jbyteArray bArray = (jbyteArray)(*env)->GetObjectField(env,obj,fnumid);

        }

 

  //其下的代码和上面直接操作数组没有区别了。

}

这里其实最不容易理解的是为什么得到数组的要用GetObjectField,因为文档看得不是太仔细,所以当初也没找到有类似于GetByteField的得到数组的函数,后来想想会不会是把数组之类的都当作了对象了,试着用这个函数测试了一下,成功了,看来这个OBJECT是个大桶,啥都可以装啊。

雨里深山雪上烟,看来容易做时难。

  评论这张
 
阅读(817)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017