Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / service / easy-setup / mediator / richsdk / android / jni / JniJvm.h
1 /******************************************************************
2  *
3  * Copyright 2016 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  ******************************************************************/
20
21 /**
22   * @file   JniJvm.h
23   *
24   * @brief  This file contains the essential declarations and functions required
25   *            for JNI implementation
26   */
27
28 #ifndef __JNI_ES_JVM_H
29 #define __JNI_ES_JVM_H
30
31 #include <jni.h>
32 #include<string>
33 #include <android/log.h>
34
35 #define ESTAG "ES-JNI"
36 #define JNI_CURRENT_VERSION JNI_VERSION_1_6
37
38 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, ESTAG, __VA_ARGS__)
39 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, ESTAG, __VA_ARGS__)
40 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, ESTAG, __VA_ARGS__)
41
42 extern JavaVM *g_jvm;
43
44 extern jclass g_cls_RemoteEnrollee;
45 extern jclass g_cls_ESException;
46
47 extern jmethodID g_mid_RemoteEnrollee_ctor ;
48 extern jmethodID g_mid_ESException_ctor;
49
50 typedef void(*RemoveListenerCallback)(JNIEnv *env, jobject jListener);
51
52 /**
53  * @brief Get the native handle field
54  */
55 static jfieldID ESGetHandleField(JNIEnv *env, jobject jobj)
56 {
57     jclass cls = env->GetObjectClass(jobj);
58     return env->GetFieldID(cls, "m_nativeHandle", "J");
59 }
60
61 /**
62  * @brief Get the native handle
63  */
64 template <typename T>
65 static T *ESGetHandle(JNIEnv *env, jobject jobj)
66 {
67     jlong handle = env->GetLongField(jobj, ESGetHandleField(env, jobj));
68     return reinterpret_cast<T *>(handle);
69 }
70
71 /**
72  * @brief Set the native handle
73  */
74 template <typename T>
75 static void ESSetHandle(JNIEnv *env, jobject jobj, T *type)
76 {
77     jlong handle = reinterpret_cast<jlong>(type);
78
79     env->SetLongField(jobj, ESGetHandleField(env, jobj), handle);
80 }
81
82 /**
83  * @brief Get the JNI Environment
84  */
85 static JNIEnv *GetESJNIEnv(jint &ret)
86 {
87     JNIEnv *env = NULL;
88
89     ret = g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION);
90     switch (ret)
91     {
92         case JNI_OK:
93             return env;
94         case JNI_EDETACHED:
95             if (g_jvm->AttachCurrentThread(&env, NULL) < 0)
96             {
97                 LOGE("Failed to get the environment");
98                 return nullptr;
99             }
100             else
101             {
102                 return env;
103             }
104
105         case JNI_EVERSION:
106             LOGE("JNI version not supported");
107         default:
108             LOGE("Failed to get the environment");
109             return nullptr;
110     }
111 }
112 #endif // __JNI_ES_JVM_H