2 * //******************************************************************
\r
4 * // Copyright 2015 Intel Corporation.
\r
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
8 * // Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * // you may not use this file except in compliance with the License.
\r
10 * // You may obtain a copy of the License at
\r
12 * // http://www.apache.org/licenses/LICENSE-2.0
\r
14 * // Unless required by applicable law or agreed to in writing, software
\r
15 * // distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * // See the License for the specific language governing permissions and
\r
18 * // limitations under the License.
\r
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
22 #include "JniOcStack.h"
\r
24 #include "OCPlatform.h"
\r
25 #include "OCRepresentation.h"
\r
26 #include "JniUtils.h"
\r
28 JavaVM* g_jvm = NULL;
\r
30 jclass g_cls_Integer = NULL;
\r
31 jclass g_cls_int1DArray = NULL;
\r
32 jclass g_cls_int2DArray = NULL;
\r
33 jclass g_cls_Double = NULL;
\r
34 jclass g_cls_double1DArray = NULL;
\r
35 jclass g_cls_double2DArray = NULL;
\r
36 jclass g_cls_Boolean = NULL;
\r
37 jclass g_cls_boolean1DArray = NULL;
\r
38 jclass g_cls_boolean2DArray = NULL;
\r
39 jclass g_cls_String = NULL;
\r
40 jclass g_cls_String1DArray = NULL;
\r
41 jclass g_cls_String2DArray = NULL;
\r
42 jclass g_cls_LinkedList = NULL;
\r
43 jclass g_cls_Map = NULL;
\r
44 jclass g_cls_MapEntry = NULL;
\r
45 jclass g_cls_Set = NULL;
\r
46 jclass g_cls_Iterator = NULL;
\r
47 jclass g_cls_HashMap = NULL;
\r
48 jclass g_cls_OcException = NULL;
\r
49 jclass g_cls_OcResource = NULL;
\r
50 jclass g_cls_OcRepresentation = NULL;
\r
51 jclass g_cls_OcRepresentation1DArray = NULL;
\r
52 jclass g_cls_OcRepresentation2DArray = NULL;
\r
53 jclass g_cls_OcResourceRequest = NULL;
\r
54 jclass g_cls_OcResourceResponse = NULL;
\r
55 jclass g_cls_OcResourceHandle = NULL;
\r
56 jclass g_cls_OcPresenceHandle = NULL;
\r
57 jclass g_cls_OcRequestHandle = NULL;
\r
58 jclass g_cls_OcPresenceStatus = NULL;
\r
59 jclass g_cls_OcHeaderOption = NULL;
\r
60 jclass g_cls_ObservationInfo = NULL;
\r
61 jclass g_cls_OcResourceIdentifier = NULL;
\r
63 jmethodID g_mid_Integer_ctor = NULL;
\r
64 jmethodID g_mid_Double_ctor = NULL;
\r
65 jmethodID g_mid_Boolean_ctor = NULL;
\r
66 jmethodID g_mid_LinkedList_ctor = NULL;
\r
67 jmethodID g_mid_LinkedList_add_object = NULL;
\r
68 jmethodID g_mid_Map_entrySet = NULL;
\r
69 jmethodID g_mid_MapEntry_getKey = NULL;
\r
70 jmethodID g_mid_MapEntry_getValue = NULL;
\r
71 jmethodID g_mid_Set_iterator = NULL;
\r
72 jmethodID g_mid_Iterator_hasNext = NULL;
\r
73 jmethodID g_mid_Iterator_next = NULL;
\r
74 jmethodID g_mid_HashMap_ctor = NULL;
\r
75 jmethodID g_mid_HashMap_put = NULL;
\r
76 jmethodID g_mid_OcException_ctor = NULL;
\r
77 jmethodID g_mid_OcException_setNativeExceptionLocation = NULL;
\r
78 jmethodID g_mid_OcResource_ctor = NULL;
\r
79 jmethodID g_mid_OcRepresentation_N_ctor = NULL;
\r
80 jmethodID g_mid_OcRepresentation_N_ctor_bool = NULL;
\r
81 jmethodID g_mid_OcResourceRequest_N_ctor = NULL;
\r
82 jmethodID g_mid_OcResourceResponse_N_ctor = NULL;
\r
83 jmethodID g_mid_OcResourceHandle_N_ctor = NULL;
\r
84 jmethodID g_mid_OcPresenceHandle_N_ctor = NULL;
\r
85 jmethodID g_mid_OcRequestHandle_N_ctor = NULL;
\r
86 jmethodID g_mid_OcHeaderOption_ctor = NULL;
\r
87 jmethodID g_mid_OcHeaderOption_get_id = NULL;
\r
88 jmethodID g_mid_OcHeaderOption_get_data = NULL;
\r
89 jmethodID g_mid_ObservationInfo_N_ctor = NULL;
\r
90 jmethodID g_mid_OcPresenceStatus_get = NULL;
\r
91 jmethodID g_mid_OcResourceIdentifier_N_ctor = NULL;
\r
93 jobject getOcException(JNIEnv* env, const char* file, const char* functionName,
\r
94 const int line, const int code, const char* message)
\r
96 std::string codeStr = JniUtils::stackResultToStr(code);
\r
97 if (codeStr.empty())
\r
99 codeStr = JniUtils::stackResultToStr(JNI_INVALID_VALUE);
\r
101 jobject ex = env->NewObject(g_cls_OcException,
\r
102 g_mid_OcException_ctor,
\r
103 env->NewStringUTF(codeStr.c_str()),
\r
104 env->NewStringUTF(message));
\r
109 env->CallVoidMethod(ex,
\r
110 g_mid_OcException_setNativeExceptionLocation,
\r
111 env->NewStringUTF(file),
\r
112 env->NewStringUTF(functionName),
\r
114 if (env->ExceptionCheck())
\r
121 void throwOcException(JNIEnv* env, jobject ex)
\r
123 env->Throw((jthrowable)ex);
\r
127 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
\r
129 LOGI("JNI_OnLoad");
\r
133 if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
\r
135 LOGE("Failed to get the environment using GetEnv()");
\r
139 jclass clazz = nullptr;
\r
142 clazz = env->FindClass("java/lang/Integer");
\r
143 if (!clazz) return JNI_ERR;
\r
144 g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
\r
145 env->DeleteLocalRef(clazz);
\r
147 g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
\r
148 if (!g_mid_Integer_ctor) return JNI_ERR;
\r
150 clazz = env->FindClass("[I");
\r
151 if (!clazz) return JNI_ERR;
\r
152 g_cls_int1DArray = (jclass)env->NewGlobalRef(clazz);
\r
153 env->DeleteLocalRef(clazz);
\r
155 clazz = env->FindClass("[[I");
\r
156 if (!clazz) return JNI_ERR;
\r
157 g_cls_int2DArray = (jclass)env->NewGlobalRef(clazz);
\r
158 env->DeleteLocalRef(clazz);
\r
161 clazz = env->FindClass("java/lang/Double");
\r
162 if (!clazz) return JNI_ERR;
\r
163 g_cls_Double = (jclass)env->NewGlobalRef(clazz);
\r
164 env->DeleteLocalRef(clazz);
\r
166 g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
\r
167 if (!g_mid_Double_ctor) return JNI_ERR;
\r
169 clazz = env->FindClass("[D");
\r
170 if (!clazz) return JNI_ERR;
\r
171 g_cls_double1DArray = (jclass)env->NewGlobalRef(clazz);
\r
172 env->DeleteLocalRef(clazz);
\r
174 clazz = env->FindClass("[[D");
\r
175 if (!clazz) return JNI_ERR;
\r
176 g_cls_double2DArray = (jclass)env->NewGlobalRef(clazz);
\r
177 env->DeleteLocalRef(clazz);
\r
180 clazz = env->FindClass("java/lang/Boolean");
\r
181 if (!clazz) return JNI_ERR;
\r
182 g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
\r
183 env->DeleteLocalRef(clazz);
\r
185 g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
\r
186 if (!g_mid_Boolean_ctor) return JNI_ERR;
\r
188 clazz = env->FindClass("[Z");
\r
189 if (!clazz) return JNI_ERR;
\r
190 g_cls_boolean1DArray = (jclass)env->NewGlobalRef(clazz);
\r
191 env->DeleteLocalRef(clazz);
\r
193 clazz = env->FindClass("[[Z");
\r
194 if (!clazz) return JNI_ERR;
\r
195 g_cls_boolean2DArray = (jclass)env->NewGlobalRef(clazz);
\r
196 env->DeleteLocalRef(clazz);
\r
199 clazz = env->FindClass("java/lang/String");
\r
200 if (!clazz) return JNI_ERR;
\r
201 g_cls_String = (jclass)env->NewGlobalRef(clazz);
\r
202 env->DeleteLocalRef(clazz);
\r
204 clazz = env->FindClass("[Ljava/lang/String;");
\r
205 if (!clazz) return JNI_ERR;
\r
206 g_cls_String1DArray = (jclass)env->NewGlobalRef(clazz);
\r
207 env->DeleteLocalRef(clazz);
\r
209 clazz = env->FindClass("[[Ljava/lang/String;");
\r
210 if (!clazz) return JNI_ERR;
\r
211 g_cls_String2DArray = (jclass)env->NewGlobalRef(clazz);
\r
212 env->DeleteLocalRef(clazz);
\r
215 clazz = env->FindClass("java/util/LinkedList");
\r
216 if (!clazz) return JNI_ERR;
\r
217 g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
\r
218 env->DeleteLocalRef(clazz);
\r
220 g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
\r
221 if (!g_mid_LinkedList_ctor) return JNI_ERR;
\r
223 g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
\r
224 if (!g_mid_LinkedList_add_object) return JNI_ERR;
\r
227 clazz = env->FindClass("java/util/Map");
\r
228 if (!clazz) return JNI_ERR;
\r
229 g_cls_Map = (jclass)env->NewGlobalRef(clazz);
\r
230 env->DeleteLocalRef(clazz);
\r
232 g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
\r
233 if (!g_mid_Map_entrySet) return JNI_ERR;
\r
236 clazz = env->FindClass("java/util/Map$Entry");
\r
237 if (!clazz) return JNI_ERR;
\r
238 g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
\r
239 env->DeleteLocalRef(clazz);
\r
241 g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
\r
242 if (!g_mid_MapEntry_getKey) return JNI_ERR;
\r
243 g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
\r
244 if (!g_mid_MapEntry_getValue) return JNI_ERR;
\r
247 clazz = env->FindClass("java/util/Set");
\r
248 if (!clazz) return JNI_ERR;
\r
249 g_cls_Set = (jclass)env->NewGlobalRef(clazz);
\r
250 env->DeleteLocalRef(clazz);
\r
252 g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
\r
253 if (!g_mid_Set_iterator) return JNI_ERR;
\r
256 clazz = env->FindClass("java/util/Iterator");
\r
257 if (!clazz) return JNI_ERR;
\r
258 g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
\r
259 env->DeleteLocalRef(clazz);
\r
261 g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
\r
262 if (!g_mid_Iterator_hasNext) return JNI_ERR;
\r
264 g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
\r
265 if (!g_mid_Iterator_next) return JNI_ERR;
\r
268 clazz = env->FindClass("java/util/HashMap");
\r
269 if (!clazz) return JNI_ERR;
\r
270 g_cls_HashMap = (jclass)env->NewGlobalRef(clazz);
\r
271 env->DeleteLocalRef(clazz);
\r
273 g_mid_HashMap_ctor = env->GetMethodID(g_cls_HashMap, "<init>", "()V");
\r
274 if (!g_mid_HashMap_ctor) return JNI_ERR;
\r
276 g_mid_HashMap_put = env->GetMethodID(g_cls_HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
\r
277 if (!g_mid_HashMap_put) return JNI_ERR;
\r
280 clazz = env->FindClass("org/iotivity/base/OcException");
\r
281 if (!clazz) return JNI_ERR;
\r
282 g_cls_OcException = (jclass)env->NewGlobalRef(clazz);
\r
283 env->DeleteLocalRef(clazz);
\r
285 g_mid_OcException_ctor = env->GetMethodID(g_cls_OcException, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
\r
286 if (!g_mid_OcException_ctor) return JNI_ERR;
\r
288 g_mid_OcException_setNativeExceptionLocation = env->GetMethodID(g_cls_OcException, "setNativeExceptionLocation",
\r
289 "(Ljava/lang/String;""Ljava/lang/String;""I)V");
\r
290 if (!g_mid_OcException_setNativeExceptionLocation) return JNI_ERR;
\r
293 clazz = env->FindClass("org/iotivity/base/OcResource");
\r
294 if (!clazz) return JNI_ERR;
\r
295 g_cls_OcResource = (jclass)env->NewGlobalRef(clazz);
\r
296 env->DeleteLocalRef(clazz);
\r
298 g_mid_OcResource_ctor = env->GetMethodID(g_cls_OcResource, "<init>", "(J)V");
\r
299 if (!g_mid_OcResource_ctor) return JNI_ERR;
\r
302 clazz = env->FindClass("org/iotivity/base/OcRepresentation");
\r
303 if (!clazz) return JNI_ERR;
\r
304 g_cls_OcRepresentation = (jclass)env->NewGlobalRef(clazz);
\r
305 env->DeleteLocalRef(clazz);
\r
307 g_mid_OcRepresentation_N_ctor = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(J)V");
\r
308 if (!g_mid_OcRepresentation_N_ctor) return JNI_ERR;
\r
310 g_mid_OcRepresentation_N_ctor_bool = env->GetMethodID(g_cls_OcRepresentation, "<init>", "(JZ)V");
\r
311 if (!g_mid_OcRepresentation_N_ctor_bool) return JNI_ERR;
\r
313 clazz = env->FindClass("[Lorg/iotivity/base/OcRepresentation;");
\r
314 if (!clazz) return JNI_ERR;
\r
315 g_cls_OcRepresentation1DArray = (jclass)env->NewGlobalRef(clazz);
\r
316 env->DeleteLocalRef(clazz);
\r
318 clazz = env->FindClass("[[Lorg/iotivity/base/OcRepresentation;");
\r
319 if (!clazz) return JNI_ERR;
\r
320 g_cls_OcRepresentation2DArray = (jclass)env->NewGlobalRef(clazz);
\r
321 env->DeleteLocalRef(clazz);
\r
324 clazz = env->FindClass("org/iotivity/base/OcHeaderOption");
\r
325 if (!clazz) return JNI_ERR;
\r
326 g_cls_OcHeaderOption = (jclass)env->NewGlobalRef(clazz);
\r
327 env->DeleteLocalRef(clazz);
\r
328 g_mid_OcHeaderOption_ctor = env->GetMethodID(g_cls_OcHeaderOption, "<init>", "(ILjava/lang/String;)V");
\r
329 if (!g_mid_OcHeaderOption_ctor) return JNI_ERR;
\r
331 g_mid_OcHeaderOption_get_id = env->GetMethodID(g_cls_OcHeaderOption, "getOptionId", "()I");
\r
332 if (!g_mid_OcHeaderOption_get_id) return JNI_ERR;
\r
334 g_mid_OcHeaderOption_get_data = env->GetMethodID(g_cls_OcHeaderOption, "getOptionData", "()Ljava/lang/String;");
\r
335 if (!g_mid_OcHeaderOption_get_data) return JNI_ERR;
\r
337 //OcResourceRequest
\r
338 clazz = env->FindClass("org/iotivity/base/OcResourceRequest");
\r
339 if (!clazz) return JNI_ERR;
\r
340 g_cls_OcResourceRequest = (jclass)env->NewGlobalRef(clazz);
\r
341 env->DeleteLocalRef(clazz);
\r
343 g_mid_OcResourceRequest_N_ctor = env->GetMethodID(g_cls_OcResourceRequest, "<init>", "(J)V");
\r
344 if (!g_mid_OcResourceRequest_N_ctor) return JNI_ERR;
\r
346 //OcResourceResponse
\r
347 clazz = env->FindClass("org/iotivity/base/OcResourceResponse");
\r
348 if (!clazz) return JNI_ERR;
\r
349 g_cls_OcResourceResponse = (jclass)env->NewGlobalRef(clazz);
\r
350 env->DeleteLocalRef(clazz);
\r
352 g_mid_OcResourceResponse_N_ctor = env->GetMethodID(g_cls_OcResourceResponse, "<init>", "(J)V");
\r
353 if (!g_mid_OcResourceResponse_N_ctor) return JNI_ERR;
\r
356 clazz = env->FindClass("org/iotivity/base/OcResourceHandle");
\r
357 if (!clazz) return JNI_ERR;
\r
358 g_cls_OcResourceHandle = (jclass)env->NewGlobalRef(clazz);
\r
359 env->DeleteLocalRef(clazz);
\r
360 g_mid_OcResourceHandle_N_ctor = env->GetMethodID(g_cls_OcResourceHandle, "<init>", "(J)V");
\r
361 if (!g_mid_OcResourceHandle_N_ctor) return JNI_ERR;
\r
364 clazz = env->FindClass("org/iotivity/base/OcPresenceHandle");
\r
365 if (!clazz) return JNI_ERR;
\r
366 g_cls_OcPresenceHandle = (jclass)env->NewGlobalRef(clazz);
\r
367 env->DeleteLocalRef(clazz);
\r
368 g_mid_OcPresenceHandle_N_ctor = env->GetMethodID(g_cls_OcPresenceHandle, "<init>", "(J)V");
\r
369 if (!g_mid_OcPresenceHandle_N_ctor) return JNI_ERR;
\r
372 clazz = env->FindClass("org/iotivity/base/OcRequestHandle");
\r
373 if (!clazz) return JNI_ERR;
\r
374 g_cls_OcRequestHandle = (jclass)env->NewGlobalRef(clazz);
\r
375 env->DeleteLocalRef(clazz);
\r
376 g_mid_OcRequestHandle_N_ctor = env->GetMethodID(g_cls_OcRequestHandle, "<init>", "(J)V");
\r
377 if (!g_mid_OcRequestHandle_N_ctor) return JNI_ERR;
\r
380 clazz = env->FindClass("org/iotivity/base/OcPresenceStatus");
\r
381 if (!clazz) return JNI_ERR;
\r
382 g_cls_OcPresenceStatus = (jclass)env->NewGlobalRef(clazz);
\r
383 env->DeleteLocalRef(clazz);
\r
384 g_mid_OcPresenceStatus_get = env->GetStaticMethodID(g_cls_OcPresenceStatus, "get",
\r
385 "(Ljava/lang/String;)Lorg/iotivity/base/OcPresenceStatus;");
\r
386 if (!g_mid_OcPresenceStatus_get) return JNI_ERR;
\r
389 clazz = env->FindClass("org/iotivity/base/ObservationInfo");
\r
390 if (!clazz) return JNI_ERR;
\r
391 g_cls_ObservationInfo = (jclass)env->NewGlobalRef(clazz);
\r
392 env->DeleteLocalRef(clazz);
\r
393 g_mid_ObservationInfo_N_ctor = env->GetMethodID(g_cls_ObservationInfo, "<init>", "(IB)V");
\r
394 if (!g_mid_ObservationInfo_N_ctor) return JNI_ERR;
\r
396 clazz = env->FindClass("org/iotivity/base/OcResourceIdentifier");
\r
397 if (!clazz) return JNI_ERR;
\r
398 g_cls_OcResourceIdentifier = (jclass)env->NewGlobalRef(clazz);
\r
399 env->DeleteLocalRef(clazz);
\r
400 g_mid_OcResourceIdentifier_N_ctor = env->GetMethodID(g_cls_OcResourceIdentifier, "<init>", "(J)V");
\r
401 if (!g_mid_OcResourceIdentifier_N_ctor) return JNI_ERR;
\r
403 return JNI_CURRENT_VERSION;
\r
406 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
\r
408 LOGI("JNI_OnUnload");
\r
411 if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
\r
413 LOGE("Failed to get the environment using GetEnv()");
\r
417 env->DeleteGlobalRef(g_cls_Integer);
\r
418 env->DeleteGlobalRef(g_cls_int1DArray);
\r
419 env->DeleteGlobalRef(g_cls_int2DArray);
\r
420 env->DeleteGlobalRef(g_cls_Double);
\r
421 env->DeleteGlobalRef(g_cls_double1DArray);
\r
422 env->DeleteGlobalRef(g_cls_double2DArray);
\r
423 env->DeleteGlobalRef(g_cls_Boolean);
\r
424 env->DeleteGlobalRef(g_cls_boolean1DArray);
\r
425 env->DeleteGlobalRef(g_cls_boolean2DArray);
\r
426 env->DeleteGlobalRef(g_cls_String);
\r
427 env->DeleteGlobalRef(g_cls_String1DArray);
\r
428 env->DeleteGlobalRef(g_cls_String2DArray);
\r
429 env->DeleteGlobalRef(g_cls_LinkedList);
\r
430 env->DeleteGlobalRef(g_cls_Map);
\r
431 env->DeleteGlobalRef(g_cls_MapEntry);
\r
432 env->DeleteGlobalRef(g_cls_Set);
\r
433 env->DeleteGlobalRef(g_cls_Iterator);
\r
434 env->DeleteGlobalRef(g_cls_HashMap);
\r
435 env->DeleteGlobalRef(g_cls_OcResource);
\r
436 env->DeleteGlobalRef(g_cls_OcException);
\r
437 env->DeleteGlobalRef(g_cls_OcRepresentation);
\r
438 env->DeleteGlobalRef(g_cls_OcRepresentation1DArray);
\r
439 env->DeleteGlobalRef(g_cls_OcRepresentation2DArray);
\r
440 env->DeleteGlobalRef(g_cls_OcResourceRequest);
\r
441 env->DeleteGlobalRef(g_cls_OcResourceResponse);
\r
442 env->DeleteGlobalRef(g_cls_OcResourceHandle);
\r
443 env->DeleteGlobalRef(g_cls_OcPresenceHandle);
\r
444 env->DeleteGlobalRef(g_cls_OcRequestHandle);
\r
445 env->DeleteGlobalRef(g_cls_OcPresenceStatus);
\r
446 env->DeleteGlobalRef(g_cls_OcHeaderOption);
\r
447 env->DeleteGlobalRef(g_cls_ObservationInfo);
\r
448 env->DeleteGlobalRef(g_cls_OcResourceIdentifier);
\r