#include "streaming_jni_common.h" std::vector jarray_to_object_id_vec(JNIEnv *env, jobjectArray jarr) { int stringCount = env->GetArrayLength(jarr); std::vector object_id_vec; for (int i = 0; i < stringCount; i++) { auto jstr = (jbyteArray)(env->GetObjectArrayElement(jarr, i)); UniqueIdFromJByteArray idFromJByteArray(env, jstr); object_id_vec.push_back(idFromJByteArray.PID); } return object_id_vec; } std::vector jarray_to_actor_id_vec(JNIEnv *env, jobjectArray jarr) { int count = env->GetArrayLength(jarr); std::vector actor_id_vec; for (int i = 0; i < count; i++) { auto bytes = (jbyteArray)(env->GetObjectArrayElement(jarr, i)); std::string id_str(ray::ActorID::Size(), 0); env->GetByteArrayRegion(bytes, 0, ray::ActorID::Size(), reinterpret_cast(&id_str.front())); actor_id_vec.push_back(ActorID::FromBinary(id_str)); } return actor_id_vec; } jint throwRuntimeException(JNIEnv *env, const char *message) { jclass exClass; char className[] = "java/lang/RuntimeException"; exClass = env->FindClass(className); return env->ThrowNew(exClass, message); } jint throwChannelInitException(JNIEnv *env, const char *message, const std::vector &abnormal_queues) { jclass array_list_class = env->FindClass("java/util/ArrayList"); jmethodID array_list_constructor = env->GetMethodID(array_list_class, "", "()V"); jmethodID array_list_add = env->GetMethodID(array_list_class, "add", "(Ljava/lang/Object;)Z"); jobject array_list = env->NewObject(array_list_class, array_list_constructor); for (auto &q_id : abnormal_queues) { jbyteArray jbyte_array = env->NewByteArray(kUniqueIDSize); env->SetByteArrayRegion( jbyte_array, 0, kUniqueIDSize, const_cast(reinterpret_cast(q_id.Data()))); env->CallBooleanMethod(array_list, array_list_add, jbyte_array); } jclass ex_class = env->FindClass("io/ray/streaming/runtime/transfer/ChannelInitException"); jmethodID ex_constructor = env->GetMethodID(ex_class, "", "(Ljava/lang/String;Ljava/util/List;)V"); jstring message_jstr = env->NewStringUTF(message); jobject ex_obj = env->NewObject(ex_class, ex_constructor, message_jstr, array_list); env->DeleteLocalRef(message_jstr); return env->Throw((jthrowable)ex_obj); } jint throwChannelInterruptException(JNIEnv *env, const char *message) { jclass ex_class = env->FindClass("io/ray/streaming/runtime/transfer/ChannelInterruptException"); return env->ThrowNew(ex_class, message); } jclass LoadClass(JNIEnv *env, const char *class_name) { jclass tempLocalClassRef = env->FindClass(class_name); jclass ret = (jclass)env->NewGlobalRef(tempLocalClassRef); STREAMING_CHECK(ret) << "Can't load Java class " << class_name; env->DeleteLocalRef(tempLocalClassRef); return ret; } template void JavaListToNativeVector(JNIEnv *env, jobject java_list, std::vector *native_vector, std::function element_converter) { jclass java_list_class = LoadClass(env, "java/util/List"); jmethodID java_list_size = env->GetMethodID(java_list_class, "size", "()I"); jmethodID java_list_get = env->GetMethodID(java_list_class, "get", "(I)Ljava/lang/Object;"); int size = env->CallIntMethod(java_list, java_list_size); native_vector->clear(); for (int i = 0; i < size; i++) { native_vector->emplace_back( element_converter(env, env->CallObjectMethod(java_list, java_list_get, (jint)i))); } } /// Convert a Java byte array to a C++ UniqueID. template inline ID JavaByteArrayToId(JNIEnv *env, const jbyteArray &bytes) { std::string id_str(ID::Size(), 0); env->GetByteArrayRegion(bytes, 0, ID::Size(), reinterpret_cast(&id_str.front())); return ID::FromBinary(id_str); } /// Convert a Java String to C++ std::string. std::string JavaStringToNativeString(JNIEnv *env, jstring jstr) { const char *c_str = env->GetStringUTFChars(jstr, nullptr); std::string result(c_str); env->ReleaseStringUTFChars(static_cast(jstr), c_str); return result; } /// Convert a Java List to C++ std::vector. void JavaStringListToNativeStringVector(JNIEnv *env, jobject java_list, std::vector *native_vector) { JavaListToNativeVector( env, java_list, native_vector, [](JNIEnv *env, jobject jstr) { return JavaStringToNativeString(env, static_cast(jstr)); }); } std::shared_ptr FunctionDescriptorToRayFunction( JNIEnv *env, jobject functionDescriptor) { jclass java_language_class = LoadClass(env, "io/ray/runtime/generated/Common$Language"); jclass java_function_descriptor_class = LoadClass(env, "io/ray/runtime/functionmanager/FunctionDescriptor"); jmethodID java_language_get_number = env->GetMethodID(java_language_class, "getNumber", "()I"); jmethodID java_function_descriptor_get_language = env->GetMethodID(java_function_descriptor_class, "getLanguage", "()Lio/ray/runtime/generated/Common$Language;"); jobject java_language = env->CallObjectMethod(functionDescriptor, java_function_descriptor_get_language); auto language = static_cast<::Language>( env->CallIntMethod(java_language, java_language_get_number)); std::vector function_descriptor_list; jmethodID java_function_descriptor_to_list = env->GetMethodID(java_function_descriptor_class, "toList", "()Ljava/util/List;"); JavaStringListToNativeStringVector( env, env->CallObjectMethod(functionDescriptor, java_function_descriptor_to_list), &function_descriptor_list); ray::FunctionDescriptor function_descriptor = ray::FunctionDescriptorBuilder::FromVector(language, function_descriptor_list); ray::RayFunction ray_function(language, function_descriptor); return std::make_shared(ray_function); } void ParseChannelInitParameters( JNIEnv *env, jobject param_obj, std::vector ¶meter_vec) { jclass java_streaming_queue_initial_parameters_class = LoadClass(env, "io/ray/streaming/runtime/transfer/" "ChannelCreationParametersBuilder"); jmethodID java_streaming_queue_initial_parameters_getParameters_method = env->GetMethodID(java_streaming_queue_initial_parameters_class, "getParameters", "()Ljava/util/List;"); STREAMING_CHECK(java_streaming_queue_initial_parameters_getParameters_method != nullptr); jclass java_streaming_queue_initial_parameters_parameter_class = LoadClass(env, "io/ray/streaming/runtime/transfer/" "ChannelCreationParametersBuilder$Parameter"); jmethodID java_getActorIdBytes_method = env->GetMethodID( java_streaming_queue_initial_parameters_parameter_class, "getActorIdBytes", "()[B"); jmethodID java_getAsyncFunctionDescriptor_method = env->GetMethodID(java_streaming_queue_initial_parameters_parameter_class, "getAsyncFunctionDescriptor", "()Lio/ray/runtime/functionmanager/FunctionDescriptor;"); jmethodID java_getSyncFunctionDescriptor_method = env->GetMethodID(java_streaming_queue_initial_parameters_parameter_class, "getSyncFunctionDescriptor", "()Lio/ray/runtime/functionmanager/FunctionDescriptor;"); // Call getParameters method jobject parameter_list = env->CallObjectMethod( param_obj, java_streaming_queue_initial_parameters_getParameters_method); JavaListToNativeVector( env, parameter_list, ¶meter_vec, [java_getActorIdBytes_method, java_getAsyncFunctionDescriptor_method, java_getSyncFunctionDescriptor_method](JNIEnv *env, jobject jobject_parameter) { ray::streaming::ChannelCreationParameter native_parameter; jbyteArray jobject_actor_id_bytes = (jbyteArray)env->CallObjectMethod( jobject_parameter, java_getActorIdBytes_method); native_parameter.actor_id = JavaByteArrayToId(env, jobject_actor_id_bytes); jobject jobject_async_func = env->CallObjectMethod( jobject_parameter, java_getAsyncFunctionDescriptor_method); native_parameter.async_function = FunctionDescriptorToRayFunction(env, jobject_async_func); jobject jobject_sync_func = env->CallObjectMethod( jobject_parameter, java_getSyncFunctionDescriptor_method); native_parameter.sync_function = FunctionDescriptorToRayFunction(env, jobject_sync_func); return native_parameter; }); }