e53d9aba40eb2713f9f9fbaf9d7b3468083bd8e1
[platform/upstream/iotivity.git] / service / resource-encapsulation / sdk / java / jni / jniutil / src / jni_re_jvm.cpp
1 /******************************************************************
2  *
3  * Copyright 2015 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 #include "jni_re_jvm.h"
21 #include "jni_re_utils.h"
22
23 JavaVM *g_jvm = NULL;
24
25 jclass g_cls_Integer = NULL;
26 jclass g_cls_Double = NULL;
27 jclass g_cls_Boolean = NULL;
28 jclass g_cls_String = NULL;
29 jclass g_cls_LinkedList = NULL;
30 jclass g_cls_Iterator = NULL;
31 jclass g_cls_Vector = NULL;
32 jclass g_cls_Map = NULL;
33 jclass g_cls_Set = NULL;
34 jclass g_cls_MapEntry = NULL;
35 jclass g_cls_RCSRemoteResourceObject = NULL;
36 jclass g_cls_RCSRemoteResourceAttributesObject = NULL;
37 jclass g_cls_RCSException = NULL;
38
39 jclass g_cls_RCSResourceObject = NULL;
40 jclass g_cls_RCSRequest = NULL;
41 jclass g_cls_RCSBundleInfo = NULL;
42
43 jmethodID g_mid_Integer_ctor = NULL;
44 jmethodID g_mid_Double_ctor = NULL;
45 jmethodID g_mid_Boolean_ctor = NULL;
46 jmethodID g_mid_LinkedList_ctor = NULL;
47 jmethodID g_mid_Set_iterator = NULL;
48 jmethodID g_mid_LinkedList_add_object = NULL;
49 jmethodID g_mid_Map_entrySet = NULL;
50 jmethodID g_mid_MapEntry_getKey = NULL;
51 jmethodID g_mid_MapEntry_getValue = NULL;
52 jmethodID g_mid_Iterator_hasNext = NULL;
53 jmethodID g_mid_Iterator_next = NULL;
54 jmethodID g_mid_RCSRemoteResourceObject_ctor = NULL;
55 jmethodID g_mid_RCSRemoteResourceAttributesObject_ctor = NULL;
56 jmethodID g_mid_RCSException_ctor = NULL;
57
58 jmethodID g_mid_RCSResourceObject_ctor = NULL;
59 jmethodID g_mid_RCSRequest_ctor = NULL;
60 jmethodID g_mid_RCSBundleInfo_ctor = NULL;
61
62 // JNI OnLoad
63 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
64 {
65     LOGI("JNI_OnLoad");
66     JNIEnv *env;
67     g_jvm = vm;
68
69     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
70     {
71         LOGE("Failed to get the environment using GetEnv()");
72         return JNI_ERR;
73     }
74
75     jclass clazz = nullptr;
76
77     //Integer
78     clazz = env->FindClass("java/lang/Integer");
79     if (!clazz) return JNI_ERR;
80     g_cls_Integer = (jclass)env->NewGlobalRef(clazz);
81     env->DeleteLocalRef(clazz);
82
83     g_mid_Integer_ctor = env->GetMethodID(g_cls_Integer, "<init>", "(I)V");
84     if (!g_mid_Integer_ctor) return JNI_ERR;
85
86     //Double
87     clazz = env->FindClass("java/lang/Double");
88     if (!clazz) return JNI_ERR;
89     g_cls_Double = (jclass)env->NewGlobalRef(clazz);
90     env->DeleteLocalRef(clazz);
91
92     g_mid_Double_ctor = env->GetMethodID(g_cls_Double, "<init>", "(D)V");
93     if (!g_mid_Double_ctor) return JNI_ERR;
94
95     //Boolean
96     clazz = env->FindClass("java/lang/Boolean");
97     if (!clazz) return JNI_ERR;
98     g_cls_Boolean = (jclass)env->NewGlobalRef(clazz);
99     env->DeleteLocalRef(clazz);
100
101     g_mid_Boolean_ctor = env->GetMethodID(g_cls_Boolean, "<init>", "(Z)V");
102     if (!g_mid_Boolean_ctor) return JNI_ERR;
103
104     //String
105     clazz = env->FindClass("java/lang/String");
106     if (!clazz) return JNI_ERR;
107     g_cls_String = (jclass)env->NewGlobalRef(clazz);
108     env->DeleteLocalRef(clazz);
109
110     //LinkedList
111     clazz = env->FindClass("java/util/LinkedList");
112     if (!clazz) return JNI_ERR;
113     g_cls_LinkedList = (jclass)env->NewGlobalRef(clazz);
114     env->DeleteLocalRef(clazz);
115
116     g_mid_LinkedList_ctor = env->GetMethodID(g_cls_LinkedList, "<init>", "()V");
117     if (!g_mid_LinkedList_ctor) return JNI_ERR;
118
119     g_mid_LinkedList_add_object = env->GetMethodID(g_cls_LinkedList, "add", "(Ljava/lang/Object;)Z");
120     if (!g_mid_LinkedList_add_object) return JNI_ERR;
121
122     //Map
123     clazz = env->FindClass("java/util/Map");
124     if (!clazz) return JNI_ERR;
125     g_cls_Map = (jclass)env->NewGlobalRef(clazz);
126     env->DeleteLocalRef(clazz);
127
128     g_mid_Map_entrySet = env->GetMethodID(g_cls_Map, "entrySet", "()Ljava/util/Set;");
129     if (!g_mid_Map_entrySet) return JNI_ERR;
130
131     //MapEntry
132     clazz = env->FindClass("java/util/Map$Entry");
133     if (!clazz) return JNI_ERR;
134     g_cls_MapEntry = (jclass)env->NewGlobalRef(clazz);
135     env->DeleteLocalRef(clazz);
136
137     g_mid_MapEntry_getKey = env->GetMethodID(g_cls_MapEntry, "getKey", "()Ljava/lang/Object;");
138     if (!g_mid_MapEntry_getKey) return JNI_ERR;
139     g_mid_MapEntry_getValue = env->GetMethodID(g_cls_MapEntry, "getValue", "()Ljava/lang/Object;");
140     if (!g_mid_MapEntry_getValue) return JNI_ERR;
141
142     //Set
143     clazz = env->FindClass("java/util/Set");
144     if (!clazz) return JNI_ERR;
145     g_cls_Set = (jclass)env->NewGlobalRef(clazz);
146     env->DeleteLocalRef(clazz);
147
148     g_mid_Set_iterator = env->GetMethodID(g_cls_Set, "iterator", "()Ljava/util/Iterator;");
149     if (!g_mid_Set_iterator) return JNI_ERR;
150
151     //Iterator
152     clazz = env->FindClass("java/util/Iterator");
153     if (!clazz) return JNI_ERR;
154     g_cls_Iterator = (jclass)env->NewGlobalRef(clazz);
155     env->DeleteLocalRef(clazz);
156
157     g_mid_Iterator_hasNext = env->GetMethodID(g_cls_Iterator, "hasNext", "()Z");
158     if (!g_mid_Iterator_hasNext) return JNI_ERR;
159
160     g_mid_Iterator_next = env->GetMethodID(g_cls_Iterator, "next", "()Ljava/lang/Object;");
161     if (!g_mid_Iterator_next) return JNI_ERR;
162
163     //Vector
164     clazz = env->FindClass("java/util/Vector");
165     if (!clazz) return JNI_ERR;
166     g_cls_Vector = (jclass)env->NewGlobalRef(clazz);
167     env->DeleteLocalRef(clazz);
168
169     //RCSRemoteResourceObject
170     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/client/RCSRemoteResourceObject");
171     if (!clazz) return JNI_ERR;
172     g_cls_RCSRemoteResourceObject = (jclass)env->NewGlobalRef(clazz);
173     env->DeleteLocalRef(clazz);
174
175     g_mid_RCSRemoteResourceObject_ctor = env->GetMethodID(g_cls_RCSRemoteResourceObject, "<init>",
176                                          "(J)V");
177     if (!g_mid_RCSRemoteResourceObject_ctor) return JNI_ERR;
178
179     //ResourceState enum
180     jclass tmpclazz = reinterpret_cast<jclass>
181             (env->FindClass("org/iotivity/ResourceEncapsulation/client/RCSRemoteResourceObject$ResourceState"));
182     if (!tmpclazz)
183     {
184         LOGE("Failed to get the class ResourceState");
185         return JNI_ERR;
186     }
187     ResourceStateWrapper::clazz = reinterpret_cast<jclass> (env->NewGlobalRef(tmpclazz));
188     env->DeleteLocalRef(tmpclazz);
189
190     //RCS Remote Resource Attributes
191     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/common/RCSResourceAttributes");
192     if (!clazz) return JNI_ERR;
193     g_cls_RCSRemoteResourceAttributesObject = (jclass)env->NewGlobalRef(clazz);
194     env->DeleteLocalRef(clazz);
195
196     g_mid_RCSRemoteResourceAttributesObject_ctor = env->GetMethodID(
197                 g_cls_RCSRemoteResourceAttributesObject, "<init>", "(J)V");
198     if (!g_mid_RCSRemoteResourceAttributesObject_ctor) return JNI_ERR;
199
200     //RCSException
201     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/common/RCSException");
202     if (!clazz) return JNI_ERR;
203     g_cls_RCSException = (jclass)env->NewGlobalRef(clazz);
204     env->DeleteLocalRef(clazz);
205
206     g_mid_RCSException_ctor = env->GetMethodID(g_cls_RCSException, "<init>", "(Ljava/lang/String;)V");
207     if (!g_mid_RCSException_ctor) return JNI_ERR;
208
209     //RCSResourceObject
210     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/server/RCSResourceObject");
211     if (!clazz) return JNI_ERR;
212     g_cls_RCSResourceObject = (jclass)env->NewGlobalRef(clazz);
213     env->DeleteLocalRef(clazz);
214
215     g_mid_RCSResourceObject_ctor = env->GetMethodID(g_cls_RCSResourceObject, "<init>",
216                                    "(J)V");
217     if (!g_mid_RCSResourceObject_ctor) return JNI_ERR;
218
219     //RCSRequest
220     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/server/RCSRequest");
221     if (!clazz) return JNI_ERR;
222     g_cls_RCSRequest = (jclass)env->NewGlobalRef(clazz);
223     env->DeleteLocalRef(clazz);
224
225     //RCSBundleInfo
226     clazz = env->FindClass("org/iotivity/ResourceEncapsulation/server/RCSBundleInfo");
227     if (!clazz) return JNI_ERR;
228     g_cls_RCSBundleInfo = (jclass)env->NewGlobalRef(clazz);
229     env->DeleteLocalRef(clazz);
230
231     g_mid_RCSBundleInfo_ctor = env->GetMethodID(g_cls_RCSBundleInfo, "<init>",
232                                "(J)V");
233     if (!g_mid_RCSBundleInfo_ctor) return JNI_ERR;
234
235     return JNI_CURRENT_VERSION;
236 }
237
238 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
239 {
240     LOGI("JNI_OnUnload");
241     JNIEnv *env;
242
243     if (g_jvm->GetEnv((void **)&env, JNI_CURRENT_VERSION) != JNI_OK)
244     {
245         LOGE("Failed to get the environment using GetEnv()");
246         return;
247     }
248
249     env->DeleteGlobalRef(g_cls_Integer);
250     env->DeleteGlobalRef(g_cls_Double);
251     env->DeleteGlobalRef(g_cls_Boolean);
252     env->DeleteGlobalRef(g_cls_String);
253     env->DeleteGlobalRef(g_cls_LinkedList);
254     env->DeleteGlobalRef(g_cls_Iterator);
255     env->DeleteGlobalRef(g_cls_RCSRemoteResourceObject);
256     env->DeleteGlobalRef(g_cls_RCSRemoteResourceAttributesObject);
257     env->DeleteGlobalRef(g_cls_RCSException);
258     env->DeleteGlobalRef(g_cls_RCSResourceObject);
259     env->DeleteGlobalRef(g_cls_RCSRequest);
260     env->DeleteGlobalRef(g_cls_Map);
261     env->DeleteGlobalRef(g_cls_Set);
262     env->DeleteGlobalRef(g_cls_MapEntry);
263     env->DeleteGlobalRef(g_cls_RCSBundleInfo);
264
265     if (env)
266     {
267         if (ResourceStateWrapper::clazz != 0)
268             env->DeleteGlobalRef(ResourceStateWrapper::clazz);
269     }
270 }