jni java返回数组_如何将数组从JNI返回到Java?

基于提出的问题,这已经在第一个答案中得到了解释,即如何通过jobjectArray传递int []。但是这是一个示例,我们如何返回包含数据列表的jobjectArray。例如,这在某些情况下很有用:当某人需要返回2D格式的数据以绘制带有x和y点的线时。以下示例显示jobjectArray如何以以下格式的形式返回数据:

Java输入到JNI:

Array [ Arraylistof x float points] [ Arraylistof y float points]

JNI输出到Java:

jobjectArray[ Arraylist个x浮点数] [ Arraylist个y浮点数]

extern "C" JNIEXPORT jobjectArray JNICALL

_MainActivity_callOpenCVFn(

JNIEnv *env, jobject /* this */,

jobjectArray list) {

//Finding arrayList class and float class(2 lists , one x and another is y)

static jclass arrayListCls = static_cast(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));

jclass floatCls = env->FindClass("java/lang/Float");

//env initialization of list object and float

static jmethodID listConstructor = env->GetMethodID(arrayListCls, "", "(I)V");

jmethodID alGetId  = env->GetMethodID(arrayListCls, "get", "(I)Ljava/lang/Object;");

jmethodID alSizeId = env->GetMethodID(arrayListCls, "size", "()I");

static jmethodID addElementToList = env->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z");

jmethodID floatConstructor = env->GetMethodID( floatCls, "", "(F)V");

jmethodID floatId = env->GetMethodID(floatCls,"floatValue", "()F");

//null check(if null then return)

if (arrayListCls == nullptr || floatCls == nullptr) {

return 0;

}

//     Get the value of each Float list object in the array

jsize length = env->GetArrayLength(list);

//If empty

if (length < 1) {

env->DeleteLocalRef(arrayListCls);

env->DeleteLocalRef(floatCls);

return 0;

}

// Creating an output jObjectArray

jobjectArray outJNIArray = env->NewObjectArray(length, arrayListCls, 0);

//taking list of X and Y points object at the time of return

jobject  xPoint,yPoint,xReturnObject,yReturnObject;

//getting the xList,yList object from the array

jobject xObjFloatList = env->GetObjectArrayElement(list, 0);

jobject yObjFloatList = env->GetObjectArrayElement(list, 1);

// number of elements present in the array object

int xPointCounts = static_cast(env->CallIntMethod(xObjFloatList, alSizeId));

static jfloat xReturn, yReturn;

jobject xReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);

jobject yReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);

for (int j = 0; j < xPointCounts; j++) {

//Getting the x points from the x object list in the array

xPoint = env->CallObjectMethod(xObjFloatList, alGetId, j);

//Getting the y points from the y object list in the array

yPoint = env->CallObjectMethod(yObjFloatList, alGetId, j);

//Returning jobjectArray(Here I am returning the same x and points I am receiving from java side, just to show how to make the returning `jobjectArray`)

//float x and y values

xReturn =static_cast(env->CallFloatMethod(xPoint, floatId,j));

yReturn =static_cast(env->CallFloatMethod(yPoint, floatId,j));

xReturnObject = env->NewObject(floatCls,floatConstructor,xReturn);

yReturnObject = env->NewObject(floatCls,floatConstructor,yReturn);

env->CallBooleanMethod(xReturnArrayList,addElementToList,xReturnObject);

env->CallBooleanMethod(yReturnArrayList,addElementToList,yReturnObject);

env->SetObjectArrayElement(outJNIArray,0,xReturnArrayList);

env->SetObjectArrayElement(outJNIArray,1,yReturnArrayList);

__android_log_print(ANDROID_LOG_ERROR, "List of X and Y are saved in the array","%d", 3);

}

return outJNIArray;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值