步骤:
1、//获取数组指针
2、//获取数组长度
3、对数组中的数据进行处理(读取处理,或者进行赋值,操作方法和 C 中对数组的读取和赋值一样)
4、释放 资源
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,byteey);
(*env)->ReleaseIntArrayElements(env,num, carr, 0);//释放
return jarrRV;
上述代码为C语言格式,C++格式如下,实例:
传入数组,返回各元素之和及平均值
//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;
}
如果需要使用JNI接口传入的数组进行数据回传,只需根据获取的数据指针和长度对数组进行赋值即可,使用数组res回传运算结果:
JNIEXPORT void JNICALL Java_TestJarr_sumAndAvg(JNIEnv *env, jobject obj, jintArray num, jintArray res)
{
//将输入的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);//释放
//将结果使用传入的数组进行回传:
jint *p = env->GetIntArrayElements(num, NULL); //获取数组指针
if (NULL == p) return NULL;
jsize len = env->GetArrayLength(num); //获取数组长度
//将结果保存在数组
*p=sum
*(p+1)=length
env->ReleaseIntArrayElements(res, p, 0);//释放
}