1 /******************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "jni_things_manager_jvm.h"
22 #include "jni_things_manager.h"
23 #include "jni_things_manager_util.h"
24 #include "JniOcResource.h"
26 #define TM_ERROR_JNI_FOUND_CLASS_FAILED -2005
30 * @brief This class provides functions for initializing the Java class path and Java class.
43 const char *szClassPath;
48 JClassMap(const char *path)
57 * @brief This class provides functins for initializing the Java Class path and Java Class
71 const char *szClassPath;
76 JObjectMap(const char *path)
83 static JClassMap gJClassMapArray[] =
85 JClassMap(TM_SERVICE_NATIVE_API_CLASS_PATH),
86 JClassMap(TM_SERVICE_CALLBACK_CLASS_PATH),
87 JClassMap(TM_SERVICE_OCRESOURCE_PATH),
88 JClassMap(TM_SERVICE_OCREPRESENTATION_PATH),
89 JClassMap(TM_SERVICE_HEADER_OPTION_PATH),
90 JClassMap(TM_SERVICE_ACTIONSET_PATH),
91 JClassMap(TM_SERVICE_CAPABILITY_PATH),
92 JClassMap(TM_SERVICE_ACTION_PATH),
93 JClassMap(TM_SERVICE_PLATFORM_CLASS_PATH),
94 JClassMap(TM_SERVICE_PLATFORM_CONFIG_CLASS_PATH),
95 JClassMap(TM_SERVICE_OCRESOURCEHANDLE_PATH)
98 static JObjectMap gJObjectMapArray[] =
100 JObjectMap(TM_SERVICE_CALLBACK_CLASS_PATH)
103 static JNINativeMethod gThingsManagerMethodTable[] =
105 { "findCandidateResources", "(Ljava/util/Vector;I)I", (void *) JNIThingsManagerFindCandidateResource},
106 { "subscribeCollectionPresence", "(Lorg/iotivity/base/OcResource;)I", (void *) JNIThingsManagerSubscribeCollectionPresence},
107 { "bindResourceToGroup", "(Lorg/iotivity/base/OcResource;Lorg/iotivity/base/OcResourceHandle;)Lorg/iotivity/base/OcResourceHandle;", (void *) JNIThingsManagerBindResourceToGroup},
108 { "findGroup", "(Ljava/util/Vector;)I", (void *) JNIThingsManagerFindGroup},
109 { "createGroup", "(Ljava/lang/String;)I", (void *) JNIThingsManagerCreateGroup},
110 { "joinGroup", "(Ljava/lang/String;Lorg/iotivity/base/OcResourceHandle;)I", (void *) JNIThingsManagerJoinGroupString},
111 { "joinGroup", "(Lorg/iotivity/base/OcResource;Lorg/iotivity/base/OcResourceHandle;)I", (void *) JNIThingsManagerJoinGroupObject},
112 { "leaveGroup", "(Ljava/lang/String;Lorg/iotivity/base/OcResourceHandle;)I", (void *) JNIThingsManagerLeaveGroup},
113 { "leaveGroup", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;Lorg/iotivity/base/OcResourceHandle;)I", (void *) JNIThingsManagerLeaveGroupForResource},
114 { "deleteGroup", "(Ljava/lang/String;)V", (void *) JNIThingsManagerDeleteGroup},
115 { "getGroupList", "()Ljava/util/Map;", (void *) JNIThingsManagerGetGroupList},
116 { "updateConfigurations", "(Lorg/iotivity/base/OcResource;Ljava/util/Map;)I", (void *) JNIThingsManagerUpdateConfigurations},
117 { "getConfigurations", "(Lorg/iotivity/base/OcResource;Ljava/util/Vector;)I", (void *) JNIThingsManagerGetConfigurations},
118 { "getListOfSupportedConfigurationUnits", "()Ljava/lang/String;", (void *) JNIThingsManagerGetListOfSupportedConfigurationUnits},
119 { "doBootstrap", "()I", (void *) JNIThingsManagerDoBootstrap},
120 { "reboot", "(Lorg/iotivity/base/OcResource;)I", (void *) JNIThingsManagerReboot},
121 { "factoryReset", "(Lorg/iotivity/base/OcResource;)I", (void *) JNIThingsManagerFactoryReset},
122 { "addActionSet", "(Lorg/iotivity/base/OcResource;Lorg/iotivity/service/tm/ActionSet;)I", (void *) JNIThingsManagerAddActionSet},
123 { "executeActionSet", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;)I", (void *) JNIThingsManagerExecuteActionSet},
124 { "executeActionSet", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;J)I", (void *) JNIThingsManagerExecuteActionSetWithDelay},
125 { "cancelActionSet", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;)I", (void *) JNIThingsManagerCancelActionSet},
126 { "getActionSet", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;)I", (void *) JNIThingsManagerGetActionSet},
127 { "deleteActionSet", "(Lorg/iotivity/base/OcResource;Ljava/lang/String;)I", (void *) JNIThingsManagerDeleteActionSet},
130 static int gThingsManagerMethodTableSize = sizeof(gThingsManagerMethodTable) / sizeof(
131 gThingsManagerMethodTable[0]);
134 int InitializeJClassMapArray(JNIEnv *env)
136 LOGI("InitializeJClassMapArray: Enter");
138 unsigned int nLen = sizeof(gJClassMapArray) / sizeof(JClassMap);
140 for (unsigned int i = 0; i < nLen; i++)
142 jclass classRef = env->FindClass(gJClassMapArray[i].szClassPath);
143 if (NULL == classRef)
145 LOGE("FindClass failed for [%s]", gJClassMapArray[i].szClassPath);
148 gJClassMapArray[i].classRef = (jclass)env->NewGlobalRef(classRef);
149 env->DeleteLocalRef(classRef);
152 LOGI("InitializeJClassMapArray: Exit");
156 jclass GetJClass(const char *szClassPath)
158 unsigned int nLen = sizeof(gJClassMapArray) / sizeof(JClassMap);
160 jclass classRef = NULL;
162 for (unsigned int i = 0; i < nLen; i++)
164 if (0 == strcmp(gJClassMapArray[i].szClassPath, szClassPath))
166 classRef = gJClassMapArray[i].classRef;
174 void DeleteClassMapArray(JNIEnv *env)
176 LOGI("DeleteClassMapArray: Enter");
178 unsigned int nLen = sizeof(gJClassMapArray) / sizeof(JClassMap);
179 for (unsigned int i = 0; i < nLen; i++)
181 if (NULL != gJClassMapArray[i].classRef)
183 env->DeleteGlobalRef(gJClassMapArray[i].classRef);
184 gJClassMapArray[i].classRef = NULL;
188 LOGI("DeleteClassMapArray: Exit");
191 int InitializeJObjectMapArray(JNIEnv *env)
193 LOGI("InitializeJObjectMapArray: Enter");
195 unsigned int nLen = sizeof(gJObjectMapArray) / sizeof(JObjectMap);
197 for (unsigned int i = 0; i < nLen; i++)
199 jclass classRef = env->FindClass(gJObjectMapArray[i].szClassPath);
200 if (NULL == classRef)
202 LOGE("InitializeJObjectMapArray: FindClass failed for [%s]", gJObjectMapArray[i].szClassPath);
206 std::string methodSignature = "()L";
207 methodSignature.append(gJObjectMapArray[i].szClassPath);
208 methodSignature.append(";");
210 // Get the object form "getInstance"
211 jmethodID methodid = env->GetStaticMethodID(classRef, "getInstance", methodSignature.c_str());
212 if (NULL == methodid)
214 LOGE("InitializeJObjectMapArray: GetStaticMethodID failed for [%s]",
215 gJObjectMapArray[i].szClassPath);
219 // Get the singleton object
220 jobject objectRef = (jobject)env->CallStaticObjectMethod(classRef, methodid);
221 if (NULL == objectRef)
223 LOGE("InitializeJObjectMapArray: CallStaticObjectMethod failed for [%s]",
224 gJObjectMapArray[i].szClassPath);
228 gJObjectMapArray[i].object = (jobject)env->NewGlobalRef(objectRef);
229 env->DeleteLocalRef(classRef);
232 LOGI("InitializeJObjectMapArray: Exit");
236 jobject GetJObjectInstance(const char *szClassPath)
238 unsigned int nLen = sizeof(gJObjectMapArray) / sizeof(JObjectMap);
240 jobject object = NULL;
242 for (unsigned int i = 0; i < nLen; i++)
244 if (0 == strcmp(gJObjectMapArray[i].szClassPath, szClassPath))
246 object = gJObjectMapArray[i].object;
254 void DeleteObjectMapArray(JNIEnv *env)
256 LOGI("DeleteObjectMapArray: Enter");
258 unsigned int nLen = sizeof(gJObjectMapArray) / sizeof(JObjectMap);
259 for (unsigned int i = 0; i < nLen; i++)
261 if (NULL != gJObjectMapArray[i].object)
263 env->DeleteGlobalRef(gJObjectMapArray[i].object);
264 gJObjectMapArray[i].object = NULL;
268 LOGI("DeleteObjectMapArray: Exit");
271 JavaVM *ThingsManagerJVM::m_jvm = NULL;
272 std::mutex ThingsManagerJVM::m_currentThreadMutex;
273 JNIEnv *ThingsManagerJVM::getEnv()
275 std::unique_lock<std::mutex> scoped_lock(m_currentThreadMutex);
279 LOGE("Failed to get JVM");
284 jint ret = m_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION);
290 if (0 > m_jvm->AttachCurrentThread(&env, NULL))
292 LOGE("Failed to attach current thread to env");
297 LOGE("JNI version not supported");
299 LOGE("Failed to get the environment");
304 void ThingsManagerJVM::releaseEnv()
306 std::unique_lock<std::mutex> scoped_lock(m_currentThreadMutex);
310 LOGE("Failed to release JVM");
314 m_jvm->DetachCurrentThread();
320 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
322 LOGD("JNI_OnLoad: Enter");
326 LOGE("JNI_OnLoad: vm is invalid");
331 if (JNI_OK != vm->GetEnv((void **) &env, JNI_CURRENT_VERSION))
333 LOGE("JNI_OnLoad: Version check is failed!");
337 if (0 != InitializeJClassMapArray(env))
339 LOGE("JNI_OnLoad: Initialize JClass Array failed!");
343 if (0 != InitializeJObjectMapArray(env))
345 LOGE("JNI_OnLoad: Initialize JObject Array failed!");
349 jclass thingsManagerClassRef = GetJClass(TM_SERVICE_NATIVE_API_CLASS_PATH);
350 if (NULL == thingsManagerClassRef)
352 LOGE("JNI_OnLoad: GetJClass gThingsManagerClass failed !");
355 env->RegisterNatives(thingsManagerClassRef, gThingsManagerMethodTable,
356 gThingsManagerMethodTableSize);
358 ThingsManagerJVM::m_jvm = vm;
360 LOGI("JNI_OnLoad: Exit");
361 return JNI_CURRENT_VERSION;
364 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
366 LOGD("JNI_OnUnload: Enter");
369 if (JNI_OK != vm->GetEnv((void **)&env, JNI_CURRENT_VERSION))
371 LOGE("JNI_OnLoad: Version check is failed!");
375 // delete all class references
376 DeleteClassMapArray(env);
378 // delete all jobject
379 DeleteObjectMapArray(env);
381 LOGD("JNI_OnUnload: Exit");