【发布时间】:2019-04-22 13:41:19
【问题描述】:
我想在 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 实例, 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]);
粗体部分出现语法错误比其他部分没有问题吗?
【问题讨论】:
-
您无法从本机代码访问这样的 Java 数组。在这种情况下,您需要使用
GetObjectArrayElement函数。虽然我真的不明白byte_array和object_array的目的是什么。为什么不直接将tempSim的每个值传递给Byte.valueOf? -
注意:
NewByteArray用于原始数组(Java:byte[];JNI:jbytearray),而不是对象数组(Java:Byte[])。
标签: java android java-native-interface native