JNI jbyteArray陣列的傳遞,java 呼叫c 程式碼時資料的傳遞與返回
阿新 • • 發佈:2021-01-20
技術標籤:Java
JNIEXPORTjbyteArray JNICALL Java_com_example_hellojni_AES_AES_1Encrypt
(JNIEnv *env, jobject jo, jbyteArray key){
//將傳入的jbyteArray 轉換為 c 中的資料
jbyte* bytekey =(*env)->GetByteArrayElements(env,key, 0);
int bytekeylen = (*env)->GetArrayLength(env,key);
//對上述陣列bytekey中的引數進行運算
//省略處理程式碼
//.....................
//例項,返回陣列bytekey
jbyteArray jarrRV =(*env)->NewByteArray(env,bytekeylen);
(*env)->SetByteArrayRegion(env,jarrRV, 0,bytekeylen,bytekey);
return jarrRV;
例項:
傳入陣列,返回各元素之和及平均值
//TestJarr.cpp
#include "TestJarr.h"
JNIEXPORT jdoubleArray JNICALL Java_TestJarr_sumAndAvg (JNIEnv *env, jobject obj, jintArray num)
{
//將輸入的jintArray轉換為C風格的陣列
jint *carr = env->GetIntArrayElements(num, NULL);
if (NULL == carr) return NULL;
jsize length = env->GetArrayLength(num);
//對陣列進行累加
jdouble sum = 0.0;
for (int i = 0; i < length; ++i)
sum += carr[ i];
//求平均值
jdouble avg = sum / length;
//釋放資源
env->ReleaseIntArrayElements(num, carr, 0);
//定義C++中的陣列
jdouble resArr[] = {sum, avg};
//轉換為JNI陣列後返回
jdoubleArray outRes = env->NewDoubleArray(2); //分配陣列所需要的空間
if(NULL == outRes) return NULL;
env->SetDoubleArrayRegion(outRes, 0, 2, resArr); //將資料拷貝到jdoubleArray所在空間
return outRes;
}