JNI编程之java层和native层的数组数据的交互
生活随笔
收集整理的這篇文章主要介紹了
JNI编程之java层和native层的数组数据的交互
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一.前言
JNI中的數(shù)組類型分為基本類型數(shù)組和引用類型數(shù)組,他們的處理方式是不一樣的。基本類型數(shù)組中的元素都是jni基本數(shù)據(jù)類型,可以直接訪問;但是引用類型的數(shù)組中的元素是一個類的實例,不能直接訪問,需要使用jni中的函數(shù)進(jìn)行訪問。
二.基本類型數(shù)組的交互
1.java層聲明的native函數(shù)如下:
public native double[] arrayAsArgs(int[] a);//求數(shù)組的和以及平均數(shù),并以數(shù)組的形式返回
2.native層代碼:
jdoubleArray native_arrayAsArgs(JNIEnv *env,jobject thiz,jintArray array){
jint *a=env->GetIntArrayElements(array, nullptr);//獲取java層數(shù)組的值,并賦給jint*指針變量
jsize length=env->GetArrayLength(array);//獲取java層數(shù)組的長度
jint sum=0;
jdouble avg=0.0;
for(int i=0;i<length;i++){
sum+=*(a+i);//訪問每一個數(shù)組元素并累加
}
avg=(jdouble)sum/length;
env->ReleaseIntArrayElements(array,a,0);//和GetIntArrayElements()是一對的,使用完之后就要釋放內(nèi)存,防止內(nèi)存泄漏
jdouble result[]={(jdouble)sum,avg};
jdoubleArray result1=env->NewDoubleArray(2);//開辟內(nèi)存空間,相當(dāng)于new double[2]
env->SetDoubleArrayRegion(result1,0,2,result);//給數(shù)組賦值
return result1;
}
三.引用類型數(shù)組的交互
1.java層聲明的native函數(shù)如下:
public native String[] quoteArrayAsArgs(String[] s);//從java中傳入引用數(shù)組到native層,并返回相同的引用數(shù)組到j(luò)ava層
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層引用數(shù)組中每個元素的值,并存儲在str1數(shù)組中
str=(jstring)env->GetObjectArrayElement(s,i);
str1[i]=str;
}
jobjectArray str2;
str2=env->NewObjectArray(length,clazz, nullptr);//為引用數(shù)組開辟內(nèi)存,相當(dāng)于new String[length]
for(int i=0;i<length;i++){
env->SetObjectArrayElement(str2,i,str1[i]);
}
return str2;
}
四.二維數(shù)組的交互
二維數(shù)組可以看作特殊的一維數(shù)組,數(shù)組中的每個元素的類型是一維數(shù)組,也就是說每個元素是一個引用類型的數(shù)據(jù),這樣理解之后,代碼就好寫了。
1.java層聲明的native函數(shù)如下:
public native char[][] twoDimenArrayAsArgs(char[][] c);//原封不動的返回c
2.native層代碼:
jobjectArray native_towDimenArrayAsArgs(JNIEnv *env,jobject thiz,jobjectArray c){
jsize rows=env->GetArrayLength(c);//獲取行數(shù)
jcharArray cc=(jcharArray)env->GetObjectArrayElement(c,0);
jsize cols=env->GetArrayLength(cc);//獲取列數(shù)
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;
}
如果是其他類型的數(shù)組,將類型換成其他類型即可,代碼不用變。
總結(jié)
以上是生活随笔為你收集整理的JNI编程之java层和native层的数组数据的交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: Linux中的进程页表
- 下一篇: MySQL索引的建立与实现