版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 30002-2024儿童牙刷通用技术要求
- 延安大学《外国文学(二)》2022-2023学年第一学期期末试卷
- 强化应急财务管理应对突发事件计划
- 建筑行业保安工作总结与反思计划
- 一年级数学计算题专项练习1000题集锦
- 二年级数学计算题专项练习1000题汇编
- 班级隔代沟通的活动安排计划
- 徐州工程学院《服装结构与工艺(一)》2022-2023学年第一学期期末试卷
- 资金借贷合同个人医疗费用三篇
- 提高水资源利用效率的途径分析计划
- 小学数学-《认识多边形》复习课教学课件设计
- 门诊挂号系统实验报告
- 53工厂质量保证能力要求00C-005
- 《大道之行也》比较阅读12篇(历年中考语文文言文阅读试题汇编)(含答案与翻译)(截至2020年)
- 百家宴活动方案
- 爱国主义教育主题班会《讲历史故事》PPT班会课件
- 清算方案模板9篇
- 2024英语美文阅读5篇
- 变频柜开关柜安装施工组织方案
- 国家电网公司变电检修通用管理规定 第3分册 组合电器检修细则
- 课本剧《东郭先生和狼》
评论
0/150
提交评论