java - 使用 android studio 更改 JNI 中的 Byte[] 值
问题描述
我想在 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] );
粗体部分出现语法错误比其他部分没有问题吗?
解决方案
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);
}
推荐阅读
- php - PHP 从原始 tcp 套接字读取数据并使用 2 React 连接器通过 WebSocket 客户端发送它们
- sql - 不使用 GROUP BY 但在选择列表中变得无效,因为它不包含在聚合函数或 GROUP BY 子句中
- typescript - 指定应用了某些约束的函数返回类型
- html - 在文本上显示字形边界的字体
- windows-10 - 将 PhpStorm 移动到新的 Windows 配置文件
- git - 发布分支总是导致合并冲突
- flutter - Flutter - MatrixGestureDetector 不能与flutter_swiper一起使用
- sql - SQL Server:条件子查询?
- javascript - NuxtJs 网站内容丰富
- r - 从 R 中的 tibble 创建列表列表(tidyverse)