如果回调函数 SetRopeRecogCallbackFunc
的参数是一个 const std::vector<int> & ropeStatus
,那么你需要对代码进行如下修改:
JNIEXPORT void JNICALL Java_com_iroad_yuedong_station_yolo_RknnWrapper_registerRopeRecogCallback(JNIEnv *env, jclass, jobject callbackObj) {
jclass callbackClass = env->GetObjectClass(callbackObj);
jmethodID ropeRecogMethodId = env->GetMethodID(callbackClass, "RopeRecogCallBackFunc", "([II)V");
jobject ropeRecogCallbackJobj = env->NewGlobalRef(callbackObj);
RKNNHandle_.SetRopeRecogCallbackFunc([&](const std::vector<int>& ropeStatus) {
JNIEnv* localEnv;
jint getEnvResult = gvm->AttachCurrentThread(reinterpret_cast<JNIEnv**>(&localEnv), nullptr);
if (getEnvResult == JNI_OK) {
jintArray statusArray = localEnv->NewIntArray(ropeStatus.size());
localEnv->SetIntArrayRegion(statusArray, 0, ropeStatus.size(), &ropeStatus[0]);
localEnv->CallVoidMethod(ropeRecogCallbackJobj, ropeRecogMethodId, statusArray, ropeStatus.size());
localEnv->DeleteLocalRef(statusArray);
gvm->DetachCurrentThread();
}
});
}
这里主要有两个修改点:
- 修改了回调函数的签名,将参数类型改为
const std::vector<int>&
. - 根据
ropeStatus
的大小动态创建数组,并将数据传递给 JNI 数组。
希望这对你有所帮助。如果还有其他问题,请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问