📄 stafjavaservicehelper.cpp
字号:
jmethodID constructor = env->GetMethodID(serviceRequestClass, sJavaConstructorMethod, sServiceRequestConstructorSig); if (constructor == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error loading constructor for Java class: " + *sServiceRequestClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error loading constructor for Java class " + *sServiceRequestClassStringPtr); gJVM->DetachCurrentThread(); return; } jobject serviceRequestObject = env->NewObject(serviceRequestClass, constructor, javaSTAFInstanceUUID, javaMachine, javaMachineNickname, javaHandleName, (jint)handle, (jint)trustLevel, (jboolean)isLocalRequest, (jint)diagEnabled, javaRequest, (jint)requestNumber, javaUser, javaEndpoint, javaPhysicalInterfaceID); if (serviceRequestObject == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error creating Java object of type " + *sServiceRequestClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error creating Java object of type " + *sServiceRequestClassStringPtr); gJVM->DetachCurrentThread(); return; } // Call the callService() method jobject javaResult = env->CallObjectMethod(gHelperObj, callService, javaServiceName, serviceRequestObject); if (javaResult == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error calling callService method for ServiceRequest object"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error calling callService method " "for ServiceRequest object"); gJVM->DetachCurrentThread(); return; } env->DeleteLocalRef(serviceRequestClass); env->DeleteLocalRef(javaSTAFInstanceUUID); env->DeleteLocalRef(javaMachine); env->DeleteLocalRef(javaMachineNickname); env->DeleteLocalRef(javaHandleName); env->DeleteLocalRef(javaRequest); env->DeleteLocalRef(javaUser); env->DeleteLocalRef(javaEndpoint); env->DeleteLocalRef(javaPhysicalInterfaceID); env->DeleteLocalRef(serviceRequestObject); env->DeleteLocalRef(javaServiceName); // Get the field IDs of the STAFResult class jclass resultClass = env->FindClass(sSTAFResultClass); if (resultClass == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error finding Java class: " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error finding Java class " + *sSTAFResultClassStringPtr); gJVM->DetachCurrentThread(); return; } jfieldID resultRCID = env->GetFieldID(resultClass, sSTAFResultRCField, sJavaIntFieldType); if (resultRCID == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error getting rc field of Java class: " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting rc field of Java class " + *sSTAFResultClassStringPtr); gJVM->DetachCurrentThread(); return; } jfieldID resultStringID = env->GetFieldID(resultClass, sSTAFResultResultField, sJavaStringFieldType); if (resultStringID == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error getting result field of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting result field of Java class " + *sSTAFResultClassStringPtr); gJVM->DetachCurrentThread(); return; } env->DeleteLocalRef(resultClass); // Get the return code and result string from the STAFResult object int rc = env->GetIntField(javaResult, resultRCID); jstring javaResultString = (jstring)env->GetObjectField(javaResult, resultStringID); env->DeleteLocalRef(javaResult); const char *utfResultString = env->GetStringUTFChars(javaResultString, 0); if (utfResultString == 0) { STAFTrace::trace( kSTAFTraceError, "Service: " + serviceName + ", Request: " + request + ", Error getting result string from the STAFResult object"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting result string from the " "STAFResult object"); gJVM->DetachCurrentThread(); return; } STAFString resultString(utfResultString, env->GetStringUTFLength(javaResultString), STAFString::kUTF8); env->ReleaseStringUTFChars(javaResultString, utfResultString); env->DeleteLocalRef(javaResultString); connection->writeUInt(rc); connection->writeString(resultString); // Detach the current thread gJVM->DetachCurrentThread();}void HandleServiceTerm(STAFConnectionPtr &connection){ STAFString serviceName = connection->readString(); // Attach the current thread JNIEnv *env = 0; jint attachRC = gJVM->AttachCurrentThread(reinterpret_cast<void **>(&env), NULL); if (attachRC != 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error attaching Java VM thread, RC: " + STAFString(attachRC)); connection->writeUInt(kSTAFJavaError); connection->writeString("Error attaching Java VM thread, RC: " + STAFString(attachRC) + " during termService " " for " + serviceName); return; } jclass helperClass = env->GetObjectClass(gHelperObj); jmethodID termService = env->GetMethodID(helperClass, sTermServiceMethod, sTermServiceMethodSig); if (termService == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error getting STAFServiceHelper.termService() method ID"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting " "STAFServiceHelper.termService() method ID " "for " + serviceName); gJVM->DetachCurrentThread(); return; } // Convert the service name to UTF-8 for Java serviceName += kUTF8_NULL; jstring javaServiceName = env->NewStringUTF(serviceName.buffer()); if (javaServiceName == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error converting service name to UTF-8"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error converting service name to UTF-8 " "during termService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Call the termService() method jobject javaResult = env->CallObjectMethod(gHelperObj, termService, javaServiceName); if (javaResult == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error calling termService method"); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error calling termService method for " + serviceName); gJVM->DetachCurrentThread(); return; } // Get the field IDs of the STAFResult class jclass resultClass = env->FindClass(sSTAFResultClass); if (resultClass == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error finding Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error finding load Java class " + *sSTAFResultClassStringPtr + " during termService for " + serviceName); gJVM->DetachCurrentThread(); return; } jfieldID resultRCID = env->GetFieldID(resultClass, sSTAFResultRCField, sJavaIntFieldType); if (resultRCID == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error getting rc field of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting rc field of Java class " + *sSTAFResultClassStringPtr + " during termService for " + serviceName); gJVM->DetachCurrentThread(); return; } jfieldID resultStringID = env->GetFieldID(resultClass, sSTAFResultResultField, sJavaStringFieldType); if (resultStringID == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error getting result field of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting result field of Java class " + *sSTAFResultClassStringPtr + " during termService for " + serviceName); gJVM->DetachCurrentThread(); return; } // Get the return code and result string from the STAFResult object jint rc = env->GetIntField(javaResult, resultRCID); jstring javaResultString = (jstring)env->GetObjectField(javaResult, resultStringID); const char *utfResultString = env->GetStringUTFChars(javaResultString, 0); if (utfResultString == 0) { STAFTrace::trace( kSTAFTraceError, "Terminating service: " + serviceName + ", Error getting result string of Java class " + *sSTAFResultClassStringPtr); env->ExceptionDescribe(); env->ExceptionClear(); connection->writeUInt(kSTAFJavaError); connection->writeString("Error getting result string of Java class " + *sSTAFResultClassStringPtr + " during termService for " + serviceName); gJVM->DetachCurrentThread(); return; } STAFString resultString(utfResultString, env->GetStringUTFLength(javaResultString), STAFString::kUTF8); env->ReleaseStringUTFChars(javaResultString, utfResultString); connection->writeUInt(rc); connection->writeString(resultString); // Detach the current thread gJVM->DetachCurrentThread();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -