使用 android studio 更改 JNI 中的 Byte[] 值

change Byte[] values in JNI with android studio

我想在 JNI 函数中引用参数 Byte[] 并替换它们的值。
JNI 的声明如下。

public native void imageprocessing(long inputImage, long inputImage2, long outputImage, long outputImage2, Byte[] sim);

sim 是我要更改的目标。
它的界面如下。

Java_com_example_duru_opencvtest_MainActivity_imageprocessing(JNIEnv *env, jobject instance, jlong inputImage, jlong inputImage2, jlong outputImage, jlong outputImage2, jobjectArray sim)

它使用 jobjectArray 类型,我想将本地语言的 int 类型值放入 sim 对象

所以我的方法是

        jbyteArray byte_array = env->NewByteArray(4);
        env->SetByteArrayRegion(byte_array, 0, 4, (jbyte*)tempSim);
        jobjectArray object_array = env->NewObjectArray(4, env->FindClass("java/lang/Byte"), byte_array);

        /* ERROR
        (*env).SetObjectArrayElement(sim, 0, (jobject)object_array[0]);
        (*env).SetObjectArrayElement(sim, 1, (jobject)object_array[1]);
        (*env).SetObjectArrayElement(sim, 2, (jobject)object_array[2]);
        (*env).SetObjectArrayElement(sim, 3, (jobject)object_array[3]);
        */     

tempSim 是 'int tempSim[4]' 并且 Sim 也有 4 个长度。

(*env).SetObjectArrayElement(sim, 0, (jobject)object_array[0]);

加粗部分出现语法错误,其他部分没问题?

jclass javaLangByteClass = env->FindClass("java/lang/Byte");
jmethodID javaLangByteConstructor = env->GetMethodID(javaLangByteClass , "<init>", "(B)Ljava/lang/Byte;")
for (int i=0; i<3; i++) {
   jobject nextElement = env->NewObject(javaLangByteClass, javaLangByteConstructor, (jbyte)tempSim[i]);
   env->SetObjectArrayElement(sim, i, nextElement);
   env->DeleteLocalRef(nextElement);
}

见下面的Byte.valueOf()可能比构造函数更高效:

jclass javaLangByteClass = env->FindClass("java/lang/Byte");
jmethodID javaLangByteStaticValueOf = env->GetStaticMethodID(javaLangByteClass , "valueOf", "(B)Ljava/lang/Byte;")
for (int i=0; i<3; i++) {
   jobject nextElement = env->CallStaticObjectMethod(javaLangByteClass, javaLangByteStaticValueOf, (jbyte)tempSim[i]);
   env->SetObjectArrayElement(sim, i, nextElement);
   env->DeleteLocalRef(nextElement);
}