jni中基本类型数组的传递方法_第1页
jni中基本类型数组的传递方法_第2页
jni中基本类型数组的传递方法_第3页
jni中基本类型数组的传递方法_第4页
jni中基本类型数组的传递方法_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JNI 中基本类型数组的传递方法(无需拷贝数据!)0、先来看一下主要用到哪些函数:C 代码 GetIntArrayElements();/ 貌似得到的是副本,要拷 贝数据 ReleaseIntArrayElements();/ 对应上面的函数的释 放资源的函数 env->GetPrimitiveArrayCritical();/ 貌似 得到的是指向原数据的指针 env->ReleasePrimitiveArrayCritical();/ 对应上面的函数 的释放资源的函数官方文档: spec/functions.html#wp17440JNI 函数的中译本 (貌似没看到 GetPri

2、mitiveArrayCritical (): 下面正式开始: 1、不知道如 何设置 JNI 环境的先看这里: 、 Java 端程序:Java 端:import java.util.Arrays;Java 代码 package tests; public class TestJNIArraystaticSystem.loadLibrary(TestJNIArray); public static native voidaddOne(int ints);/ 数组元素 1 public static native void addOne(double ints);/ 数组元素 1 ,为了测试, C

3、 中 循环了 5 次 public static native int getNewArray(int size,int initValue);/ 生成初始值为 initValue 的数组,数组长 度为 sizepublic static void main(String args)throws InterruptedException int n=20; final int a=new intn;for (int i = 0; i< a.length; i ) ai=i; if(n<50)System.out.println(Arrays.toString(a); addOne(

4、a);if(n<50)System.out.println(Arrays.toString(a);final double d=new doublen;for (int i = 0; i <d.length; i ) di=i; /addOne(d);if(n<50)System.out.println(Arrays.toString(d); new Thread(new Runnable() Overridepublic void run() addOne(d); ).start();for (int i = 0; i <200; i ) Thread.sleep(2

5、0);System.out.println(Arrays.toString(d); if(dd.length-1-d0!=n-1)System.out.println( 检测到 C 端 更新数据中 );/ 看看能否找到在 C 更新数组时 Java 端又读 取数据的情况 int b=getNewArray(2, 9);System.out.println(Arrays.toString(b);int c=getNewArray(0, 9);System.out.println(Arrays.toString(c); 3、 C 端程序:C 代码 #include tests_TestJNIArra

6、y.h#include<windows.h>#include <time.h>#include<iostream> #include <string>classTimer private:clock_t time; public:Timer() time=clock(); clock_t getElapsedTime()return clock()-time;clock_t getElapsedTimeAndRestart() tmp=time; time=clock();returnclock_t int return JNIEXPORT vo

7、idtime-tmp; void restart() time=clock(); getCLOCKS_PER_SEC() CLOCKS_PER_SEC; ;JNICALL Java_tests_TestJNIArray_addOne_3I( JNIEnv* env, jclass, jintArray intArray) jboolean b;Timer timer; jint* pint=env->GetIntArrayElements(intArray,&b);/ 获取 指针!第二个参数可为 NULL std:string str=b?true:false; long t=t

8、imer.getElapsedTimeAndRestart(); std:cout<<GetIntArrayElements() 耗时 : <<t<<t 为副本? <<str<<std:endl;/ 很悲 剧,自己得到的是副本 (copy 了一份, 速度慢啊) jsizesize=env->GetArrayLength(intArray);for (int i=0;i<size; i ) pinti =1;env->ReleaseIntArrayElements(intArray,pint,0);/ 释放 / 对于最

9、后一个参数 (如果指针指向的数组为副 本时,否则该参数不起作用 ) / 0 copy back the content and free the elems buffer /JNI_COMMITcopy back the content but do not freethe elems buffer/JNI_ABORTfreethe buffer without copying back the possible changes std:cout<< 从 c 程序返回 <<std:endl; JNIEXPORT void JNICALL Java_tests_TestJ

10、NIArray_addOne_3D( JNIEnv * env, jclass, jdoubleArray intArray) jboolean b; Timer timer; double* pd=(double*)env->GetPrimitiveArrayCritical(intArray,&a mp;b); /if(pd=NULL)return; 理论上应该检查! ! long t=timer.getElapsedTimeAndRestart(); jsize size=env->GetArrayLength(intArray);std:stringstr=b?true:f

11、alse; std:cout<<GetPrimitiveArrayCritical() 耗时 : <<t<<t 为副本? <<str<<std:endl;/ 这次 是原始数据了, happy 啊!for(int j=0;j<5;j ) /验证一下, Java 中的数据也在更新! ! Sleep(1000);for (int i=0; i<size; i )pdi=1; Sleep(10); env->ReleasePrimitiveArrayCritical(intArray,pd,0);/ 别忘 了释放 虽然不知道

12、不释放有什么问题。 。 std:cout<< 从 c 程序返回 <<std:endl; JNIEXPORT jintArray JNICALL Java_tests_TestJNIArray_getNewArray( JNIEnv * env,jclass, jint size, jint initValue ) jintArray intArray=env->NewIntArray(size); jboolean* pb;/jint* pint=env->GetIntArrayElements(intArray,pb);jint* pint=new jintsize;std:stringstr=*pb?true:false; std:cout<< 自己生成的 Java 数组,取出指针,为副本? <<str<<std:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论