@@ -242,6 +242,84 @@ Java_org_ros2_rcljava_node_NodeImpl_nativeCreateTimerHandle(
242242 return jtimer;
243243}
244244
245+ JNIEXPORT void JNICALL
246+ Java_org_ros2_rcljava_node_NodeImpl_nativeGetNodeNames (
247+ JNIEnv * env, jclass, jlong handle, jobject jnode_names_info)
248+ {
249+ rcl_node_t * node = reinterpret_cast <rcl_node_t *>(handle);
250+ if (!node) {
251+ rcljava_throw_exception (env, " java/lang/IllegalArgumentException" , " node handle is NULL" );
252+ return ;
253+ }
254+
255+ jclass list_clazz = env->GetObjectClass (jnode_names_info);
256+ jmethodID list_add_mid = env->GetMethodID (list_clazz, " add" , " (Ljava/lang/Object;)Z" );
257+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
258+ jclass node_info_clazz = env->FindClass (" org/ros2/rcljava/graph/NodeNameInfo" );
259+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
260+ jmethodID node_info_init_mid = env->GetMethodID (node_info_clazz, " <init>" , " ()V" );
261+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
262+ jfieldID name_fid = env->GetFieldID (node_info_clazz, " name" , " Ljava/lang/String;" );
263+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
264+ jfieldID namespace_fid = env->GetFieldID (node_info_clazz, " namespace" , " Ljava/lang/String;" );
265+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
266+ jfieldID enclave_fid = env->GetFieldID (node_info_clazz, " enclave" , " Ljava/lang/String;" );
267+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
268+
269+ rcl_allocator_t allocator = rcl_get_default_allocator ();
270+ rcutils_string_array_t node_names = rcutils_get_zero_initialized_string_array ();
271+ rcutils_string_array_t node_namespaces = rcutils_get_zero_initialized_string_array ();
272+ rcutils_string_array_t enclaves = rcutils_get_zero_initialized_string_array ();
273+
274+ rcl_ret_t ret = rcl_get_node_names_with_enclaves (
275+ node,
276+ allocator,
277+ &node_names,
278+ &node_namespaces,
279+ &enclaves);
280+ RCLJAVA_COMMON_THROW_FROM_RCL (env, ret, " rcl_get_node_names_with_enclaves failed" );
281+ auto on_scope_exit = rcpputils::make_scope_exit (
282+ [pnames = &node_names, pnamespaces = &node_namespaces, penclaves = &enclaves, env]() {
283+ rcl_ret_t ret = rcutils_string_array_fini (pnames);
284+ if (!env->ExceptionCheck () && RCL_RET_OK != ret) {
285+ rcljava_throw_rclexception (env, ret, " failed to fini node names string array" );
286+ }
287+ ret = rcutils_string_array_fini (pnamespaces);
288+ if (!env->ExceptionCheck () && RCL_RET_OK != ret) {
289+ rcljava_throw_rclexception (env, ret, " failed to fini node namespaces string array" );
290+ }
291+ ret = rcutils_string_array_fini (penclaves);
292+ if (!env->ExceptionCheck () && RCL_RET_OK != ret) {
293+ rcljava_throw_rclexception (env, ret, " failed to fini enclaves string array" );
294+ }
295+ }
296+ );
297+
298+ if (node_names.size != node_namespaces.size || node_names.size != enclaves.size ) {
299+ rcljava_throw_exception (
300+ env,
301+ " java/lang/IllegalStateException" ,
302+ " names, namespaces and enclaves array leghts don't match" );
303+ return ;
304+ }
305+
306+ for (size_t i = 0 ; i < node_names.size ; i++) {
307+ jstring jnode_name = env->NewStringUTF (node_names.data [i]);
308+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
309+ jstring jnode_namespace = env->NewStringUTF (node_namespaces.data [i]);
310+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
311+ jstring jenclave = env->NewStringUTF (enclaves.data [i]);
312+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
313+ jobject jitem = env->NewObject (node_info_clazz, node_info_init_mid);
314+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
315+ env->SetObjectField (jitem, name_fid, jnode_name);
316+ env->SetObjectField (jitem, namespace_fid, jnode_namespace);
317+ env->SetObjectField (jitem, enclave_fid, jenclave);
318+ env->CallBooleanMethod (jnode_names_info, list_add_mid, jitem);
319+ RCLJAVA_COMMON_CHECK_FOR_EXCEPTION (env);
320+ }
321+ }
322+
245323JNIEXPORT void JNICALL
246324Java_org_ros2_rcljava_node_NodeImpl_nativeGetTopicNamesAndTypes (
247325 JNIEnv * env, jclass, jlong handle, jobject jnames_and_types)
0 commit comments