@@ -379,9 +379,10 @@ Java_org_ros2_rcljava_node_NodeImpl_nativeGetTopicNamesAndTypes(
379379 }
380380}
381381
382- JNIEXPORT void JNICALL
383- Java_org_ros2_rcljava_node_NodeImpl_nativeGetPublishersInfo (
384- JNIEnv * env, jclass, jlong handle, jstring jtopic_name, jobject jpublishers_info)
382+ template <typename FunctorT>
383+ void
384+ get_endpoint_info_common (
385+ JNIEnv * env, jlong handle, jstring jtopic_name, jobject jendpoints_info, FunctorT get_info)
385386{
386387 rcl_node_t * node = reinterpret_cast <rcl_node_t *>(handle);
387388 if (!node) {
@@ -391,7 +392,7 @@ Java_org_ros2_rcljava_node_NodeImpl_nativeGetPublishersInfo(
391392 }
392393
393394 rcutils_allocator_t allocator = rcutils_get_default_allocator ();
394- rcl_topic_endpoint_info_array_t publishers_info =
395+ rcl_topic_endpoint_info_array_t endpoints_info =
395396 rcl_get_zero_initialized_topic_endpoint_info_array ();
396397
397398 const char * topic_name = env->GetStringUTFChars (jtopic_name, NULL );
@@ -401,26 +402,26 @@ Java_org_ros2_rcljava_node_NodeImpl_nativeGetPublishersInfo(
401402 return ;
402403 }
403404
404- rcl_ret_t ret = rcl_get_publishers_info_by_topic (
405+ rcl_ret_t ret = get_info (
405406 node,
406407 &allocator,
407408 topic_name,
408409 false , // use ros mangling conventions
409- &publishers_info );
410+ &endpoints_info );
410411
411412 env->ReleaseStringUTFChars (jtopic_name, topic_name);
412413
413414 RCLJAVA_COMMON_THROW_FROM_RCL (env, ret, " failed to get publisher info" );
414415 auto cleanup_info_array = rcpputils::make_scope_exit (
415- [info_ptr = &publishers_info , allocator_ptr = &allocator, env]() {
416+ [info_ptr = &endpoints_info , allocator_ptr = &allocator, env]() {
416417 rcl_ret_t ret = rcl_topic_endpoint_info_array_fini (info_ptr, allocator_ptr);
417418 if (!env->ExceptionCheck () && RCL_RET_OK != ret) {
418- rcljava_throw_rclexception (env, ret, " failed to destroy rcl publisher info" );
419+ rcljava_throw_rclexception (env, ret, " failed to destroy rcl endpoints info" );
419420 }
420421 }
421422 );
422423
423- jclass list_clazz = env->GetObjectClass (jpublishers_info );
424+ jclass list_clazz = env->GetObjectClass (jendpoints_info );
424425 jmethodID list_add_mid = env->GetMethodID (list_clazz, " add" , " (Ljava/lang/Object;)Z" );
425426 RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
426427 jclass endpoint_info_clazz = env->FindClass (" org/ros2/rcljava/graph/EndpointInfo" );
@@ -431,13 +432,29 @@ Java_org_ros2_rcljava_node_NodeImpl_nativeGetPublishersInfo(
431432 endpoint_info_clazz, " nativeFromRCL" , " (J)V" );
432433 RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
433434
434- for (size_t i = 0 ; i < publishers_info .size ; i++) {
435+ for (size_t i = 0 ; i < endpoints_info .size ; i++) {
435436 jobject item = env->NewObject (endpoint_info_clazz, endpoint_info_init_mid);
436437 RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
437- env->CallVoidMethod (item, endpoint_info_from_rcl_mid, &publishers_info .info_array [i]);
438+ env->CallVoidMethod (item, endpoint_info_from_rcl_mid, &endpoints_info .info_array [i]);
438439 RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
439- env->CallBooleanMethod (jpublishers_info , list_add_mid, item);
440+ env->CallBooleanMethod (jendpoints_info , list_add_mid, item);
440441 RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
441442 env->DeleteLocalRef (item);
442443 }
443444}
445+
446+ JNIEXPORT void JNICALL
447+ Java_org_ros2_rcljava_node_NodeImpl_nativeGetPublishersInfo (
448+ JNIEnv * env, jclass, jlong handle, jstring jtopic_name, jobject jpublishers_info)
449+ {
450+ get_endpoint_info_common (
451+ env, handle, jtopic_name, jpublishers_info, rcl_get_publishers_info_by_topic);
452+ }
453+
454+ JNIEXPORT void JNICALL
455+ Java_org_ros2_rcljava_node_NodeImpl_nativeGetSubscriptionsInfo (
456+ JNIEnv * env, jclass, jlong handle, jstring jtopic_name, jobject jsubscriptions_info)
457+ {
458+ get_endpoint_info_common (
459+ env, handle, jtopic_name, jsubscriptions_info, rcl_get_subscriptions_info_by_topic);
460+ }
0 commit comments