Skip to content

Commit d2ea45d

Browse files
committed
Add action server with logic for accepting and canceling goals (osrf#53)
* Add interfaces for action goal, result, and feedback Implementing these interfaces in the code generation template makes it easier to pass around these types in a generic way. Note, the 'final' modifier had to be removed from generated message types in order to extend goal, result, and feedback types in action definitions. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add new definitions for action goal response and request Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add getter for UUID to SendGoalRequest Also make inner classes static. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add getStamp method to GoalResponseDefinition Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Partially revert "Add interfaces for action goal, result, and feedback" Partially revert commit dd04614. I don't think we need to aliases for the message types, but I'll add them back if they turn out to be useful. * Parameterize goal request and response interfaces on action type Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Fix getGoalUuid implementation It should return a List, since it is hashable. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * List<Byte> -> byte[] Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add ActionServer skeleton * Add new action module with classes/interfaces related to the ActionServer * Add methods for creating and removing ActionServers from a Node * Implement dispose method for ActionServer. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add ActionServer creation logic and unit tests Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add action server logic for accepting and canceling goals This changeset includes the following: * an implementation of the goal handle for action servers * action server integration with the base executor * action server integration with ROS nodes * unit tests for the action server, receiving goal and cancel requests Signed-off-by: Jacob Perron <jacob@openrobotics.org> * cleanup Signed-off-by: Jacob Perron <jacob@openrobotics.org> * more cleanup Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Minor refactor: move response enums into callback interfaces Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove TODO The goal request already contains a getter for the goal ID. Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Fix accident Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Alphabetize Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Refactor: replace 'getNumberOf*()' JNI functions with single 'getNumberOfEntites()' function Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Avoid string copy Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove extern C Replace with 'namespace rcljava' Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove unnecessary synchronization Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Refactor access to goalCallback Signed-off-by: Jacob Perron <jacob@openrobotics.org> * typesafe request and response definitions Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Be more specific about template type for GoalCallback Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Minor refactor Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Make GoalHandleImpl inner class instead of static Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Remove synchronized from getHandle Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add TODO for Waitable interface Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Fix style Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Minor refactor Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Add docs for createActionServer Signed-off-by: Jacob Perron <jacob@openrobotics.org> * Switch from List to array Signed-off-by: Jacob Perron <jacob@openrobotics.org>
1 parent 15a1567 commit d2ea45d

21 files changed

+2196
-66
lines changed

rcljava/CMakeLists.txt

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ cmake_minimum_required(VERSION 3.5)
22

33
project(rcljava)
44

5+
find_package(action_msgs REQUIRED)
56
find_package(ament_cmake REQUIRED)
67
find_package(ament_cmake_export_jars REQUIRED)
78
find_package(ament_cmake_export_jni_libraries REQUIRED)
89
find_package(builtin_interfaces REQUIRED)
910
find_package(rcl REQUIRED)
11+
find_package(rcl_action REQUIRED)
1012
find_package(rcl_interfaces REQUIRED)
1113
find_package(rcljava_common REQUIRED)
1214
find_package(rmw REQUIRED)
1315
find_package(rmw_implementation_cmake REQUIRED)
1416
find_package(rosgraph_msgs REQUIRED)
17+
find_package(unique_identifier_msgs REQUIRED)
1518

1619
include(CrossCompilingExtra)
1720

@@ -57,6 +60,8 @@ endif()
5760
set(${PROJECT_NAME}_jni_sources
5861
"src/main/cpp/org_ros2_rcljava_RCLJava.cpp"
5962
"src/main/cpp/org_ros2_rcljava_Time.cpp"
63+
"src/main/cpp/org_ros2_rcljava_action_ActionServerImpl.cpp"
64+
"src/main/cpp/org_ros2_rcljava_action_ActionServerImpl_GoalHandleImpl.cpp"
6065
"src/main/cpp/org_ros2_rcljava_client_ClientImpl.cpp"
6166
"src/main/cpp/org_ros2_rcljava_contexts_ContextImpl.cpp"
6267
"src/main/cpp/org_ros2_rcljava_detail_QosIncompatibleStatus.cpp"
@@ -105,11 +110,14 @@ foreach(_jni_source ${${PROJECT_NAME}_jni_sources})
105110
endif()
106111

107112
ament_target_dependencies(${_target_name}
108-
"rcl"
109-
"rcljava_common"
113+
"action_msgs"
110114
"builtin_interfaces"
115+
"rcl"
116+
"rcl_action"
111117
"rcl_interfaces"
118+
"rcljava_common"
112119
"rosgraph_msgs"
120+
"unique_identifier_msgs"
113121
)
114122

115123
target_include_directories(${_target_name}
@@ -129,6 +137,12 @@ endforeach()
129137
set(${PROJECT_NAME}_sources
130138
"src/main/java/org/ros2/rcljava/RCLJava.java"
131139
"src/main/java/org/ros2/rcljava/Time.java"
140+
"src/main/java/org/ros2/rcljava/action/ActionServer.java"
141+
"src/main/java/org/ros2/rcljava/action/ActionServerGoalHandle.java"
142+
"src/main/java/org/ros2/rcljava/action/ActionServerImpl.java"
143+
"src/main/java/org/ros2/rcljava/action/CancelCallback.java"
144+
"src/main/java/org/ros2/rcljava/action/GoalCallback.java"
145+
"src/main/java/org/ros2/rcljava/action/GoalStatus.java"
132146
"src/main/java/org/ros2/rcljava/client/Client.java"
133147
"src/main/java/org/ros2/rcljava/client/ClientImpl.java"
134148
"src/main/java/org/ros2/rcljava/concurrent/Callback.java"
@@ -205,10 +219,12 @@ add_jar("${PROJECT_NAME}_jar"
205219
OUTPUT_NAME
206220
${PROJECT_NAME}
207221
INCLUDE_JARS
208-
${rcljava_common_JARS}
222+
${action_msgs_JARS}
209223
${builtin_interfaces_JARS}
210224
${rcl_interfaces_JARS}
225+
${rcljava_common_JARS}
211226
${rosgraph_msgs_JARS}
227+
${unique_identifier_msgs_JARS}
212228
)
213229

214230
install_jar("${PROJECT_NAME}_jar" "share/${PROJECT_NAME}/java")
@@ -218,6 +234,7 @@ if(BUILD_TESTING)
218234
find_package(ament_lint_auto REQUIRED)
219235
find_package(std_msgs REQUIRED)
220236
find_package(mockito_vendor REQUIRED)
237+
find_package(test_msgs REQUIRED)
221238
ament_lint_auto_find_test_dependencies()
222239

223240
set(${PROJECT_NAME}_message_files
@@ -245,9 +262,11 @@ if(BUILD_TESTING)
245262
${${PROJECT_NAME}_message_files}
246263
${${PROJECT_NAME}_service_files}
247264
DEPENDENCIES
265+
action_msgs
248266
builtin_interfaces
249267
rcl_interfaces
250268
rosgraph_msgs
269+
unique_identifier_msgs
251270
${_java_type_supports}
252271
SKIP_INSTALL
253272
)
@@ -264,6 +283,8 @@ if(BUILD_TESTING)
264283
"src/test/java/org/ros2/rcljava/RCLJavaTest.java"
265284
"src/test/java/org/ros2/rcljava/SpinTest.java"
266285
"src/test/java/org/ros2/rcljava/TimeTest.java"
286+
"src/test/java/org/ros2/rcljava/action/ActionServerTest.java"
287+
"src/test/java/org/ros2/rcljava/action/MockActionClient.java"
267288
"src/test/java/org/ros2/rcljava/client/ClientTest.java"
268289
"src/test/java/org/ros2/rcljava/contexts/ContextTest.java"
269290
"src/test/java/org/ros2/rcljava/node/NodeOptionsTest.java"
@@ -283,6 +304,7 @@ if(BUILD_TESTING)
283304
"org.ros2.rcljava.RCLJavaTest"
284305
"org.ros2.rcljava.SpinTest"
285306
"org.ros2.rcljava.TimeTest"
307+
"org.ros2.rcljava.action.ActionServerTest"
286308
"org.ros2.rcljava.client.ClientTest"
287309
"org.ros2.rcljava.contexts.ContextTest"
288310
"org.ros2.rcljava.node.NodeOptionsTest"
@@ -344,6 +366,33 @@ if(BUILD_TESTING)
344366
list_append_unique(_deps_library_dirs ${_dep_dir})
345367
endforeach()
346368

369+
foreach(_dep_lib ${action_msgs_LIBRARIES})
370+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
371+
list_append_unique(_deps_library_dirs ${_dep_dir})
372+
endforeach()
373+
foreach(_dep_lib ${action_msgs_JNI_LIBRARIES})
374+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
375+
list_append_unique(_deps_library_dirs ${_dep_dir})
376+
endforeach()
377+
378+
foreach(_dep_lib ${unique_identifier_msgs_LIBRARIES})
379+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
380+
list_append_unique(_deps_library_dirs ${_dep_dir})
381+
endforeach()
382+
foreach(_dep_lib ${unique_identifier_msgs_JNI_LIBRARIES})
383+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
384+
list_append_unique(_deps_library_dirs ${_dep_dir})
385+
endforeach()
386+
387+
foreach(_dep_lib ${test_msgs_LIBRARIES})
388+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
389+
list_append_unique(_deps_library_dirs ${_dep_dir})
390+
endforeach()
391+
foreach(_dep_lib ${test_msgs_JNI_LIBRARIES})
392+
get_filename_component(_dep_dir "${_dep_lib}" DIRECTORY)
393+
list_append_unique(_deps_library_dirs ${_dep_dir})
394+
endforeach()
395+
347396
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR})
348397
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR}/rcljava)
349398
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_java/rcljava/msg/)
@@ -359,13 +408,16 @@ if(BUILD_TESTING)
359408
TESTS
360409
"${testsuite}"
361410
INCLUDE_JARS
411+
"${action_msgs_JARS}"
362412
"${rcljava_common_JARS}"
363413
"${rcljava_test_msgs_JARS}"
364414
"${std_msgs_JARS}"
365415
"${builtin_interfaces_JARS}"
366416
"${rcl_interfaces_JARS}"
367417
"${rosgraph_msgs_JARS}"
418+
"${test_msgs_JARS}"
368419
"${mockito_vendor_JARS}"
420+
"${unique_identifier_msgs_JARS}"
369421
"${_${PROJECT_NAME}_jar_file}"
370422
"${_${PROJECT_NAME}_messages_jar_file}"
371423
APPEND_LIBRARY_DIRS
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Copyright 2020 ros2-java contributors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <jni.h>
16+
/* Header for class org_ros2_rcljava_action_ActionServerImpl */
17+
18+
#ifndef ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_H_
19+
#define ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_H_
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
/*
25+
* Class: org_ros2_rcljava_action_ActionServerImpl
26+
* Method: nativeGetNumberOfEntities
27+
* Signature: (L)[I
28+
* Returns array of numbers for each type of entity,
29+
* [subscriptions, guard_conditions, timers, clients, services]
30+
*/
31+
JNIEXPORT jintArray
32+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeGetNumberOfEntities(
33+
JNIEnv *, jclass, jlong);
34+
35+
/*
36+
* Class: org_ros2_rcljava_action_ActionServerImpl
37+
* Method: nativeGetReadyEntities
38+
* Signature: (LL)[Z
39+
*/
40+
JNIEXPORT jbooleanArray
41+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeGetReadyEntities(
42+
JNIEnv *, jclass, jlong, jlong);
43+
44+
/*
45+
* Class: org_ros2_rcljava_action_ActionServerImpl
46+
* Method: nativeDispose
47+
* Signature: (JJ)V
48+
*/
49+
JNIEXPORT void
50+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeDispose(JNIEnv *, jclass, jlong, jlong);
51+
52+
/*
53+
* Class: org_ros2_rcljava_action_ActionServerImpl
54+
* Method: nativeCreateActionServer
55+
* Signature: (JLjava/lang/Class;Ljava/lang/String;)J
56+
*/
57+
JNIEXPORT jlong
58+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeCreateActionServer(
59+
JNIEnv *, jobject, jlong, jlong, jclass, jstring);
60+
61+
/*
62+
* Class: org_ros2_rcljava_action_ActionServerImpl
63+
* Method: nativeTakeGoalRequest
64+
* Signature: (JJJJLorg/ros2/rcljava/interfaces/MessageDefinition;)Lorg/ros2/rcljava/RMWRequestId;
65+
*/
66+
JNIEXPORT jobject
67+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeTakeGoalRequest(
68+
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jobject);
69+
70+
/*
71+
* Class: org_ros2_rcljava_action_ActionServerImpl
72+
* Method: nativeTakeCancelRequest
73+
* Signature: (JJJJLorg/ros2/rcljava/interfaces/MessageDefinition;)Lorg/ros2/rcljava/RMWRequestId;
74+
*/
75+
JNIEXPORT jobject
76+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeTakeCancelRequest(
77+
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jobject);
78+
79+
/*
80+
* Class: org_ros2_rcljava_action_ActionServerImpl
81+
* Method: nativeTakeResultRequest
82+
* Signature: (JJJJLorg/ros2/rcljava/interfaces/MessageDefinition;)Lorg/ros2/rcljava/RMWRequestId;
83+
*/
84+
JNIEXPORT jobject
85+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeTakeResultRequest(
86+
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jobject);
87+
88+
/*
89+
* Class: org_ros2_rcljava_action_ActionServerImpl
90+
* Method: nativeSendGoalResponse
91+
* Signature: (JLorg/ros2/rcljava/RMWRequestId;JJJLorg/ros2/rcljava/interfaces/MessageDefinition;)
92+
*/
93+
JNIEXPORT void
94+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeSendGoalResponse(
95+
JNIEnv *, jclass, jlong, jobject, jlong, jlong, jlong, jobject);
96+
97+
/*
98+
* Class: org_ros2_rcljava_action_ActionServerImpl
99+
* Method: nativeSendCancelResponse
100+
* Signature: (JLorg/ros2/rcljava/RMWRequestId;JJJLorg/ros2/rcljava/interfaces/MessageDefinition;)
101+
*/
102+
JNIEXPORT void
103+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeSendCancelResponse(
104+
JNIEnv *, jclass, jlong, jobject, jlong, jlong, jlong, jobject);
105+
106+
/*
107+
* Class: org_ros2_rcljava_action_ActionServerImpl
108+
* Method: nativeSendResultResponse
109+
* Signature: (JLorg/ros2/rcljava/RMWRequestId;JJJLorg/ros2/rcljava/interfaces/MessageDefinition;)
110+
*/
111+
JNIEXPORT void
112+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeSendResultResponse(
113+
JNIEnv *, jclass, jlong, jobject, jlong, jlong, jlong, jobject);
114+
115+
/*
116+
* Class: org_ros2_rcljava_action_ActionServerImpl
117+
* Method: nativeProcessCancelRequest
118+
* Signature: (JJJJLorg/ros2/rcljava/interfaces/MessageDefinition;Lorg/ros2/rcljava/interfaces/MessageDefinition;)
119+
*/
120+
JNIEXPORT void
121+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeProcessCancelRequest(
122+
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jobject, jobject);
123+
124+
/*
125+
* Class: org_ros2_rcljava_action_ActionServerImpl
126+
* Method: nativeCheckGoalExists
127+
* Signature: (JLorg/ros2/rcljava/interfaces/MessageDefinition;JJ)Z
128+
*/
129+
130+
JNIEXPORT jboolean
131+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_nativeCheckGoalExists(
132+
JNIEnv * env, jclass,
133+
jlong, jobject, jlong, jlong);
134+
135+
#ifdef __cplusplus
136+
}
137+
#endif
138+
#endif // ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_H__
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright 2020 ros2-java contributors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <jni.h>
16+
/* Header for class org_ros2_rcljava_action_ActionServerImpl_GoalHandleImpl */
17+
18+
#ifndef ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_GOALHANDLEIMPL_H_
19+
#define ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_GOALHANDLEIMPL_H_
20+
#ifdef __cplusplus
21+
extern "C" {
22+
#endif
23+
24+
/*
25+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
26+
* Method: nativeAcceptNewGoal
27+
* Signature: (JJJLorg/ros2/rcljava/interfaces/MessageDefinition;)J
28+
*/
29+
JNIEXPORT jlong
30+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeAcceptNewGoal(
31+
JNIEnv *, jclass, jlong, jlong, jlong, jobject);
32+
33+
/*
34+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
35+
* Method: nativeGetStatus
36+
* Signature: (J)I
37+
*/
38+
JNIEXPORT int
39+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGetStatus(
40+
JNIEnv *, jclass, jlong);
41+
42+
/*
43+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
44+
* Method: nativeGoalEventExecute
45+
* Signature: (J)
46+
*/
47+
JNIEXPORT void
48+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGoalEventExecute(
49+
JNIEnv * env, jclass, jlong);
50+
51+
/*
52+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
53+
* Method: nativeGoalEventCancelGoal
54+
* Signature: (J)
55+
*/
56+
JNIEXPORT void
57+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGoalEventCancelGoal(
58+
JNIEnv * env, jclass, jlong);
59+
60+
/*
61+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
62+
* Method: nativeGoalEventSucceed
63+
* Signature: (J)
64+
*/
65+
JNIEXPORT void
66+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGoalEventSucceed(
67+
JNIEnv * env, jclass, jlong);
68+
69+
/*
70+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
71+
* Method: nativeGoalEventAbort
72+
* Signature: (J)
73+
*/
74+
JNIEXPORT void
75+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGoalEventAbort(
76+
JNIEnv * env, jclass, jlong);
77+
78+
/*
79+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
80+
* Method: nativeGoalEventCanceled
81+
* Signature: (J)
82+
*/
83+
JNIEXPORT void
84+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeGoalEventCanceled(
85+
JNIEnv * env, jclass, jlong);
86+
87+
/*
88+
* Class: org_ros2_rcljava_action_ActionServerImpl$GoalHandleImpl
89+
* Method: nativeDispose
90+
* Signature: (J)
91+
*/
92+
JNIEXPORT void
93+
JNICALL Java_org_ros2_rcljava_action_ActionServerImpl_00024GoalHandleImpl_nativeDipose(
94+
JNIEnv *, jclass, jlong);
95+
96+
#ifdef __cplusplus
97+
}
98+
#endif
99+
#endif // ORG_ROS2_RCLJAVA_ACTION_ACTIONSERVERIMPL_GOALHANDLEIMPL_H__

0 commit comments

Comments
 (0)