版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁夏回族自治区银川市贺兰县2024-2025学年高三上学期1月期末学科测试数学试题(含答案)
- 14合同条款专用部分二标段-
- 2025年度企业破产重整财产分割与债务重组专项合同3篇
- 2024高尔夫球场土方建设合同
- 2025年SET支付系统升级与加密技术保障服务协议3篇
- 2025年度医疗器械OEM委托生产与市场准入合同2篇
- 福建省南平市九三英华学校2020-2021学年高一物理上学期期末试卷含解析
- 福建省南平市建阳漳墩中学2022年高一数学理联考试卷含解析
- 2025年度厂区绿化养护与可持续发展服务协议3篇
- 2024生产承包合同
- 新疆塔城地区(2024年-2025年小学六年级语文)部编版期末考试(下学期)试卷及答案
- 四人合伙投资协议书范本
- 2024年9月时事政治试题带答案
- 反射疗法师3级考试题库(含答案)
- 汽车供应商审核培训
- 山东省济南市2023-2024学年高二上学期期末考试地理试题 附答案
- 期末复习试题1(试题)-2024-2025学年二年级上册数学北师大版
- 1《地球的表面》说课稿-2024-2025学年科学五年级上册教科版
- 汽车以租代购合同完整版完整版
- 音乐制作基础知识单选题100道及答案解析
- 2024至2030年大型储油罐项目投资价值分析报告
评论
0/150
提交评论