void JniOnGetListener::onGetCallback(const HeaderOptions& headerOptions, const OCRepresentation& ocRepresentation, const int eCode) { jint envRet = JNI_ERR; JNIEnv *env = GetJNIEnv(envRet); if (nullptr == env) { return; } jobject jListener = env->NewLocalRef(m_jwListener); if (!jListener) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } jclass clsL = env->GetObjectClass(jListener); if (!clsL) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } if (OC_STACK_OK != eCode) { jobject ex = GetOcException(eCode, "stack error in onGetCallback"); if (!ex) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } jmethodID midL = env->GetMethodID(clsL, "onGetFailed", "(Ljava/lang/Throwable;)V"); if (!midL) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } env->CallVoidMethod(jListener, midL, ex); } else { jobject jHeaderOptionList = JniUtils::convertHeaderOptionsVectorToJavaList(env, headerOptions); if (!jHeaderOptionList) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } OCRepresentation* rep = new OCRepresentation(ocRepresentation); jlong handle = reinterpret_cast<jlong>(rep); jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool, handle, true); if (!jRepresentation) { delete rep; checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } jmethodID midL = env->GetMethodID(clsL, "onGetCompleted", "(Ljava/util/List;Lorg/iotivity/base/OcRepresentation;)V"); if (!midL) { delete rep; checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } return; } env->CallVoidMethod(jListener, midL, jHeaderOptionList, jRepresentation); if (env->ExceptionCheck()) { LOGE("Java exception is thrown"); delete rep; } } checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) { g_jvm->DetachCurrentThread(); } }
void JniOnObserveListener::onObserveCallback(const HeaderOptions headerOptions, const OCRepresentation& ocRepresentation, const int& eCode, const int& sequenceNumber) { jint envRet; JNIEnv *env = GetJNIEnv(envRet); if (NULL == env) return; jobject jListener = env->NewLocalRef(m_jwListener); if (!jListener) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } jclass clsL = env->GetObjectClass(jListener); if (!clsL) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } if (OC_STACK_OK != eCode && OC_STACK_RESOURCE_CREATED != eCode && OC_STACK_RESOURCE_DELETED != eCode) { jobject ex = GetOcException(eCode, "stack error in onObserveCallback"); if (!ex) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } jmethodID midL = env->GetMethodID(clsL, "onObserveFailed", "(Ljava/lang/Throwable;)V"); if (!midL) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } env->CallVoidMethod(jListener, midL, ex); } else { jobject jHeaderOptionList = JniUtils::convertHeaderOptionsVectorToJavaList(env, headerOptions); if (!jHeaderOptionList) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } OCRepresentation * rep = new OCRepresentation(ocRepresentation); jlong handle = reinterpret_cast<jlong>(rep); jobject jRepresentation = env->NewObject(g_cls_OcRepresentation, g_mid_OcRepresentation_N_ctor_bool, handle, true); if (!jRepresentation) { delete rep; checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } jmethodID midL = env->GetMethodID(clsL, "onObserveCompleted", "(Ljava/util/List;Lorg/iotivity/base/OcRepresentation;I)V"); if (!midL) { checkExAndRemoveListener(env); if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); return; } env->CallVoidMethod(jListener, midL, jHeaderOptionList, jRepresentation, static_cast<jint>(sequenceNumber)); if (env->ExceptionCheck()) { LOGE("Java exception is thrown"); delete rep; jthrowable ex = env->ExceptionOccurred(); env->ExceptionClear(); m_ownerResource->removeOnObserveListener(env, m_jwListener); env->Throw((jthrowable)ex); } } if (JNI_EDETACHED == envRet) g_jvm->DetachCurrentThread(); }