JNI jbyteArray数组的传递,java 调用c 代码时数据的传递与返回

步骤:
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);//释放
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值