日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JNI编程之java层和native层的数组数据的交互

發布時間:2023/10/18 编程问答 171 如意码农
生活随笔 收集整理的這篇文章主要介紹了 JNI编程之java层和native层的数组数据的交互 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.前言

  JNI中的數組類型分為基本類型數組和引用類型數組,他們的處理方式是不一樣的。基本類型數組中的元素都是jni基本數據類型,可以直接訪問;但是引用類型的數組中的元素是一個類的實例,不能直接訪問,需要使用jni中的函數進行訪問。

二.基本類型數組的交互

  1.java層聲明的native函數如下:

public native double[] arrayAsArgs(int[] a);//求數組的和以及平均數,并以數組的形式返回

  2.native層代碼:

jdoubleArray native_arrayAsArgs(JNIEnv *env,jobject thiz,jintArray array){
jint *a=env->GetIntArrayElements(array, nullptr);//獲取java層數組的值,并賦給jint*指針變量
jsize length=env->GetArrayLength(array);//獲取java層數組的長度
jint sum=0;
jdouble avg=0.0;
for(int i=0;i<length;i++){
sum+=*(a+i);//訪問每一個數組元素并累加
}
avg=(jdouble)sum/length;
env->ReleaseIntArrayElements(array,a,0);//和GetIntArrayElements()是一對的,使用完之后就要釋放內存,防止內存泄漏
jdouble result[]={(jdouble)sum,avg};
jdoubleArray result1=env->NewDoubleArray(2);//開辟內存空間,相當于new double[2]
env->SetDoubleArrayRegion(result1,0,2,result);//給數組賦值
return result1;
}

三.引用類型數組的交互

  1.java層聲明的native函數如下:

public native String[] quoteArrayAsArgs(String[] s);//從java中傳入引用數組到native層,并返回相同的引用數組到java層

  2.native層代碼:

jobjectArray native_quoteArrayAsArgs(JNIEnv *env,jobject thiz,jobjectArray s){
jclass clazz=env->FindClass("java/lang/String");
jsize length=env->GetArrayLength(s);
jstring str;
jstring str1[length];
for(int i=0;i<length;i++){//獲取java層引用數組中每個元素的值,并存儲在str1數組中
str=(jstring)env->GetObjectArrayElement(s,i);
str1[i]=str;
}
jobjectArray str2;
str2=env->NewObjectArray(length,clazz, nullptr);//為引用數組開辟內存,相當于new String[length]
for(int i=0;i<length;i++){
env->SetObjectArrayElement(str2,i,str1[i]);
}
return str2;
}

四.二維數組的交互

  二維數組可以看作特殊的一維數組,數組中的每個元素的類型是一維數組,也就是說每個元素是一個引用類型的數據,這樣理解之后,代碼就好寫了。

  1.java層聲明的native函數如下:

public native char[][] twoDimenArrayAsArgs(char[][] c);//原封不動的返回c

  2.native層代碼:

jobjectArray native_towDimenArrayAsArgs(JNIEnv *env,jobject thiz,jobjectArray c){
jsize rows=env->GetArrayLength(c);//獲取行數
jcharArray cc=(jcharArray)env->GetObjectArrayElement(c,0);
jsize cols=env->GetArrayLength(cc);//獲取列數
jchar result[rows][cols];
for(int i=0;i<rows;i++){
cc=(jcharArray)env->GetObjectArrayElement(c,i);
jchar *character=env->GetCharArrayElements(cc, nullptr);
for(int j=0;j<cols;j++){
result[i][j]=*(character+j);
}
env->ReleaseCharArrayElements(cc,character,0);
}
jclass clazz=env->FindClass("[C");//char[]的Class對象
jobjectArray ret=env->NewObjectArray(rows,clazz, nullptr);
for(int i=0;i<rows;i++){
jcharArray jcharArray=env->NewCharArray(cols);
env->SetCharArrayRegion(jcharArray,0,cols,result[i]);
env->SetObjectArrayElement(ret,i,jcharArray);
}
return ret;
}

  如果是其他類型的數組,將類型換成其他類型即可,代碼不用變。

總結

以上是生活随笔為你收集整理的JNI编程之java层和native层的数组数据的交互的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。