jni中基本類型數(shù)組的傳遞方法_第1頁(yè)
jni中基本類型數(shù)組的傳遞方法_第2頁(yè)
jni中基本類型數(shù)組的傳遞方法_第3頁(yè)
jni中基本類型數(shù)組的傳遞方法_第4頁(yè)
jni中基本類型數(shù)組的傳遞方法_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JNI 中基本類型數(shù)組的傳遞方法(無(wú)需拷貝數(shù)據(jù)!)0、先來(lái)看一下主要用到哪些函數(shù):C 代碼 GetIntArrayElements();/ 貌似得到的是副本,要拷 貝數(shù)據(jù) ReleaseIntArrayElements();/ 對(duì)應(yīng)上面的函數(shù)的釋 放資源的函數(shù) env->GetPrimitiveArrayCritical();/ 貌似 得到的是指向原數(shù)據(jù)的指針 env->ReleasePrimitiveArrayCritical();/ 對(duì)應(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è)試, C

3、 中 循環(huán)了 5 次 public static native int getNewArray(int size,int initValue);/ 生成初始值為 initValue 的數(shù)組,數(shù)組長(zhǎng) 度為 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 端 更新數(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);/ 釋放 / 對(duì)于最

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、不釋放有什么問(wèn)題。 。 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論