版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、JNI 中基本類型數(shù)組的傳遞方法(無需拷貝數(shù)據(jù)!)0、先來看一下主要用到哪些函數(shù):C 代碼 GetIntArrayElements();/ 貌似得到的是副本,要拷 貝數(shù)據(jù) ReleaseIntArrayElements();/ 對應(yīng)上面的函數(shù)的釋 放資源的函數(shù) env->GetPrimitiveArrayCritical();/ 貌似 得到的是指向原數(shù)據(jù)的指針 env->ReleasePrimitiveArrayCritical();/ 對應(yīng)上面的函數(shù) 的釋放資源的函數(shù)官方文檔: spec/functions.html#wp17440JNI 函數(shù)的中譯本 (貌似沒看到 GetPri
2、mitiveArrayCritical (): 下面正式開始: 1、不知道如 何設(shè)置 JNI 環(huán)境的先看這里: 、 Java 端程序:Java 端:import java.util.Arrays;Java 代碼 package tests; public class TestJNIArraystaticSystem.loadLibrary(TestJNIArray); public static native voidaddOne(int ints);/ 數(shù)組元素 1 public static native void addOne(double ints);/ 數(shù)組元素 1 ,為了測試, C
3、 中 循環(huán)了 5 次 public static native int getNewArray(int size,int initValue);/ 生成初始值為 initValue 的數(shù)組,數(shù)組長 度為 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 端 更新數(shù)據(jù)中 );/ 看看能否找到在 C 更新數(shù)組時(shí) Java 端又讀 取數(shù)據(jù)的情況 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);/ 獲取 指針!第二個(gè)參數(shù)可為 NULL std:string str=b?true:false; long t=t
8、imer.getElapsedTimeAndRestart(); std:cout<<GetIntArrayElements() 耗時(shí) : <<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、后一個(gè)參數(shù) (如果指針指向的數(shù)組為副 本時(shí),否則該參數(shù)不起作用 ) / 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; 理論上應(yīng)該檢查! ! long t=timer.getElapsedTimeAndRestart(); jsize size=env->GetArrayLength(intArray);std:stringstr=b?true:f
11、alse; std:cout<<GetPrimitiveArrayCritical() 耗時(shí) : <<t<<t 為副本? <<str<<std:endl;/ 這次 是原始數(shù)據(jù)了, happy ??!for(int j=0;j<5;j ) /驗(yàn)證一下, Java 中的數(shù)據(jù)也在更新! ! 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 數(shù)組,取出指針,為副本? <<str<<std:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025擔(dān)保旅游合同書
- 2025貨物保險(xiǎn)合同范文
- 二零二五年度幼兒園園長任期幼兒身心健康保障合同3篇
- 2025年度農(nóng)村宅基地房買賣合同(農(nóng)村旅游特色小鎮(zhèn)開發(fā))
- 二零二五年度農(nóng)村土地承包權(quán)土地經(jīng)營權(quán)流轉(zhuǎn)信息化建設(shè)合同
- 二零二五年度城市民宿租賃規(guī)范合同關(guān)于房屋出租3篇
- 二零二五幼兒入園早教托班全日制服務(wù)協(xié)議樣本3篇
- 二零二五年度漁業(yè)養(yǎng)殖市場調(diào)研與養(yǎng)魚合同3篇
- 二零二五年度新能源汽車核心零部件供貨協(xié)議模板3篇
- 2025年度園林景觀設(shè)計(jì)樹木補(bǔ)償合同3篇
- Unit 4 Plants around us Part A(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- “小城鎮(zhèn)建設(shè)”論文(六篇)
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 生物 含解析
- 設(shè)備維護(hù)保養(yǎng)培訓(xùn)
- 三管三必須-新安法宣貫課件
- 農(nóng)戶種地合作協(xié)議書范本模板
- 住院病人身體約束護(hù)理
- 公共機(jī)構(gòu)能耗定額 第3部分:教育機(jī)構(gòu)DB41-T 1960.3-2021
- “雙減”初中九年級英語課時(shí)作業(yè)設(shè)計(jì)案例
- 廣東省潮州市暨實(shí)高級中學(xué)2024-2025學(xué)年高二上學(xué)期9月月考語文試題
- GB/T 44415-2024基于全球衛(wèi)星導(dǎo)航的機(jī)動車制動性能路試檢驗(yàn)要求和方法
評論
0/150
提交評論