如何将 jint 插入到 jobjectArray 中?
How to insert a jint into a jobjectArray?
如何通过 jni 正确构造和传递不同对象的数组?我似乎无法将 jint 转换为 jobject。
我原来的功能是:
extern "C" JNIEXPORT jint ... Func(...)
{
int res = CallNativeFunc();
return res;
}
现在,我正在修改函数,因此它将 return 一个对象数组。第一个对象将是原始的 res
,第二个对象将是一个 jbyteArray。
我试过:
extern "C" JNIEXPORT jobjectArray ... Func(...)
{
std::vector<unsigned char> outData;
int res = CallNativeFunc(&outData);
//construct the returning object array of size 2
jclass objectClass = env->FindClass("java/lang/Object");
jobjectArray results = env->NewObjectArray(2, objectClass, 0);
//construct the 2nd object (a jbyteArray)
jbyteArray SecondObject = env->NewByteArray(outData.size());
//transfer data into the 2nd object
env->SetByteArrayRegion(SecondObject , 0, outData.size(), reinterpret_cast<const signed char*>(outData.data()));
//transfer the 1st and 2nd objects into the return array
env->SetObjectArrayElement(results, 0, static_cast<jint>(res));
env->SetObjectArrayElement(results, 1, SecondObject);
return results;
}
编译器在以下行失败,表示无法将 jint 转换为 jobject:
env->SetObjectArrayElement(results, 0, static_cast<jint>(res));
我做错了什么?这是做我想做的事情的正确方法吗? (将数组 "structure" 返回给 java)
Java 中的 int
是基本类型,而不是 Object
。因此,如果您想将 int
存储在 Object[]
中,则需要将其包装在 Integer
.
中
代码看起来像这样(未经测试):
jclass integerClass = env->FindClass("java/lang/Integer");
jmethodID integerConstructor = env->GetMethodID(integerClass, "<init>", "(I)V");
jobject wrappedInt = env->NewObject(integerClass, integerConstructor, static_cast<jint>(res));
env->SetObjectArrayElement(results, 0, wrappedInt);
如何通过 jni 正确构造和传递不同对象的数组?我似乎无法将 jint 转换为 jobject。 我原来的功能是:
extern "C" JNIEXPORT jint ... Func(...)
{
int res = CallNativeFunc();
return res;
}
现在,我正在修改函数,因此它将 return 一个对象数组。第一个对象将是原始的 res
,第二个对象将是一个 jbyteArray。
我试过:
extern "C" JNIEXPORT jobjectArray ... Func(...)
{
std::vector<unsigned char> outData;
int res = CallNativeFunc(&outData);
//construct the returning object array of size 2
jclass objectClass = env->FindClass("java/lang/Object");
jobjectArray results = env->NewObjectArray(2, objectClass, 0);
//construct the 2nd object (a jbyteArray)
jbyteArray SecondObject = env->NewByteArray(outData.size());
//transfer data into the 2nd object
env->SetByteArrayRegion(SecondObject , 0, outData.size(), reinterpret_cast<const signed char*>(outData.data()));
//transfer the 1st and 2nd objects into the return array
env->SetObjectArrayElement(results, 0, static_cast<jint>(res));
env->SetObjectArrayElement(results, 1, SecondObject);
return results;
}
编译器在以下行失败,表示无法将 jint 转换为 jobject:
env->SetObjectArrayElement(results, 0, static_cast<jint>(res));
我做错了什么?这是做我想做的事情的正确方法吗? (将数组 "structure" 返回给 java)
Java 中的 int
是基本类型,而不是 Object
。因此,如果您想将 int
存储在 Object[]
中,则需要将其包装在 Integer
.
代码看起来像这样(未经测试):
jclass integerClass = env->FindClass("java/lang/Integer");
jmethodID integerConstructor = env->GetMethodID(integerClass, "<init>", "(I)V");
jobject wrappedInt = env->NewObject(integerClass, integerConstructor, static_cast<jint>(res));
env->SetObjectArrayElement(results, 0, wrappedInt);