1. 程式人生 > 其它 >JNI jbyteArray陣列的傳遞,java 呼叫c 程式碼時資料的傳遞與返回

JNI jbyteArray陣列的傳遞,java 呼叫c 程式碼時資料的傳遞與返回

技術標籤: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; }