@@ -51,6 +51,95 @@ JNIEnv* Plugin::GetJavaEnv(int id)
5151 return this ->jenvs [id - 1 ];
5252}
5353
54+ jobject Plugin::ToJavaObject (JNIEnv* jenv, Lua::LuaValue value)
55+ {
56+ switch (value.GetType ())
57+ {
58+ case Lua::LuaValue::Type::STRING:
59+ {
60+ return (jobject)jenv->NewStringUTF (value.GetValue <std::string>().c_str ());
61+ } break ;
62+ case Lua::LuaValue::Type::INTEGER:
63+ {
64+ jclass jcls = jenv->FindClass (" java/lang/Integer" );
65+ return jenv->NewObject (jcls, jenv->GetMethodID (jcls, " <init>" , " (I)V" ), value.GetValue <int >());
66+ } break ;
67+ case Lua::LuaValue::Type::BOOLEAN:
68+ {
69+ jclass jcls = jenv->FindClass (" java/lang/Boolean" );
70+ return jenv->NewObject (jcls, jenv->GetMethodID (jcls, " <init>" , " (Z)V" ), value.GetValue <bool >());
71+ } break ;
72+ case Lua::LuaValue::Type::TABLE:
73+ {
74+ jclass jcls = jenv->FindClass (" java/util/HashMap" );
75+ jobject jmap = jenv->NewObject (jcls, jenv->GetMethodID (jcls, " <init>" , " ()V" ));
76+ jmethodID putMethod = jenv->GetMethodID (jcls, " put" , " (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" );
77+
78+ Lua::LuaTable_t table = value.GetValue <Lua::LuaTable_t>();
79+ table->ForEach ([jenv, jmap, putMethod](Lua::LuaValue k, Lua::LuaValue v) {
80+ jenv->CallObjectMethod (jmap, putMethod, Plugin::Get ()->ToJavaObject (jenv, k), Plugin::Get ()->ToJavaObject (jenv, v));
81+ });
82+
83+ return jmap;
84+ } break ;
85+ case Lua::LuaValue::Type::NIL:
86+ case Lua::LuaValue::Type::INVALID:
87+ break ;
88+ default :
89+ break ;
90+ }
91+
92+ return NULL ;
93+ }
94+
95+ Lua::LuaValue Plugin::ToLuaValue (JNIEnv* jenv, jobject object)
96+ {
97+ jclass jcls = jenv->GetObjectClass (object);
98+
99+ if (jenv->IsInstanceOf (object, jenv->FindClass (" java/lang/String" ))) {
100+ jstring element = (jstring)object;
101+ const char * pchars = jenv->GetStringUTFChars (element, nullptr );
102+
103+ Lua::LuaValue value (pchars);
104+
105+ jenv->ReleaseStringUTFChars (element, pchars);
106+ jenv->DeleteLocalRef (element);
107+
108+ return value;
109+ }
110+ else if (jenv->IsInstanceOf (object, jenv->FindClass (" java/lang/Integer" ))) {
111+ jmethodID intValueMethod = jenv->GetMethodID (jcls, " intValue" , " ()I" );
112+ jint result = jenv->CallIntMethod (object, intValueMethod);
113+
114+ Lua::LuaValue value (result);
115+ return value;
116+ }
117+ else if (jenv->IsInstanceOf (object, jenv->FindClass (" java/lang/Boolean" ))) {
118+ jmethodID boolValueMethod = jenv->GetMethodID (jcls, " booleanValue" , " ()Z" );
119+ jboolean result = jenv->CallBooleanMethod (object, boolValueMethod);
120+
121+ Lua::LuaValue value (result);
122+ return value;
123+ }
124+ else if (jenv->IsInstanceOf (object, jenv->FindClass (" java/util/List" ))) {
125+ jmethodID sizeMethod = jenv->GetMethodID (jcls, " size" , " ()I" );
126+ jmethodID getMethod = jenv->GetMethodID (jcls, " get" , " (I)Ljava/lang/Object;" );
127+ jint len = jenv->CallIntMethod (object, sizeMethod);
128+
129+ Lua::LuaTable_t table (new Lua::LuaTable);
130+
131+ for (jint i = 0 ; i < len; i++) {
132+ jobject arrayElement = jenv->CallObjectMethod (object, getMethod, i);
133+ table->Add (i + 1 , Plugin::Get ()->ToLuaValue (jenv, arrayElement));
134+ }
135+
136+ Lua::LuaValue value (table);
137+ return value;
138+ }
139+
140+ return NULL ;
141+ }
142+
54143void CallEvent (JNIEnv* jenv, jclass jcl, jstring event, jobject argsList) {
55144 (void ) jcl;
56145
@@ -65,35 +154,8 @@ void CallEvent(JNIEnv* jenv, jclass jcl, jstring event, jobject argsList) {
65154
66155 for (jint i = 0 ; i < len; i++) {
67156 jobject arrayElement = jenv->CallObjectMethod (argsList, getMethod, i);
68-
69- if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/String" ))) {
70- jstring element = (jstring)arrayElement;
71- const char * pchars = jenv->GetStringUTFChars (element, nullptr );
72-
73- args->push_back (pchars);
74- jenv->ReleaseStringUTFChars (element, pchars);
75- jenv->DeleteLocalRef (element);
76- }
77- else if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/Integer" ))) {
78- jmethodID intValueMethod = jenv->GetMethodID (jenv->GetObjectClass (arrayElement), " intValue" , " ()I" );
79- jint result = jenv->CallIntMethod (arrayElement, intValueMethod);
80-
81- args->push_back (result);
82- }
83- else if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/Boolean" ))) {
84- jmethodID boolValueMethod = jenv->GetMethodID (jenv->GetObjectClass (arrayElement), " booleanValue" , " ()Z" );
85- jboolean result = jenv->CallBooleanMethod (arrayElement, boolValueMethod);
86-
87- args->push_back (result);
88- }
157+ args->push_back (Plugin::Get ()->ToLuaValue (jenv, arrayElement));
89158 }
90- } else if (jenv->IsInstanceOf (argsList, jenv->FindClass (" java/lang/String" ))) {
91- jstring element = (jstring)argsList;
92- const char * pchars = jenv->GetStringUTFChars (element, nullptr );
93- args->push_back (pchars);
94-
95- jenv->ReleaseStringUTFChars (element, pchars);
96- jenv->DeleteLocalRef (element);
97159 }
98160
99161 Onset::Plugin::Get ()->CallEvent (eventStr, args);
@@ -169,28 +231,7 @@ Plugin::Plugin()
169231 jobject* params = new jobject[arg_size - 4 ];
170232 for (int i = 4 ; i < arg_size; i++) {
171233 auto const & value = arg_list[i];
172-
173- switch (value.GetType ())
174- {
175- case Lua::LuaValue::Type::STRING:
176- {
177- params[i - 4 ] = (jobject)jenv->NewStringUTF (value.GetValue <std::string>().c_str ());
178- } break ;
179- case Lua::LuaValue::Type::INTEGER:
180- {
181- jclass jcls = jenv->FindClass (" java/lang/Integer" );
182- jobject jobj = jenv->NewObject (jcls, jenv->GetMethodID (jcls, " <init>" , " (I)V" ), value.GetValue <int >());
183- params[i - 4 ] = jobj;
184- } break ;
185- case Lua::LuaValue::Type::NIL:
186- case Lua::LuaValue::Type::INVALID:
187- break ;
188- default :
189- char buffer[50 ];
190- sprintf (buffer, " Unsupported parameter #%d in CallJavaStaticMethod." , i);
191- Onset::Plugin::Get ()->Log (buffer);
192- break ;
193- }
234+ params[i - 4 ] = Plugin::Get ()->ToJavaObject (jenv, value);
194235 }
195236
196237 jclass clazz = jenv->FindClass (className.c_str ());
@@ -239,67 +280,31 @@ Plugin::Plugin()
239280 break ;
240281 }
241282
242- bool handled = false ;
243283 if (returnValue != nullptr ) {
244- jclass cls = jenv->GetObjectClass (returnValue);
245-
246- if (jenv->IsInstanceOf (returnValue, jenv->FindClass (" java/lang/String" ))) {
247- const char * cstr = jenv->GetStringUTFChars ((jstring)returnValue, NULL );
248- std::string str = std::string (cstr);
249- jenv->ReleaseStringUTFChars ((jstring)returnValue, cstr);
250-
251- Lua::ReturnValues (L, str);
252- handled = true ;
253- } else if (jenv->IsInstanceOf (returnValue, jenv->FindClass (" java/lang/Integer" ))) {
254- jmethodID intValueMethod = jenv->GetMethodID (cls, " intValue" , " ()I" );
255- jint result = jenv->CallIntMethod (returnValue, intValueMethod);
256-
257- Lua::ReturnValues (L, result);
258- handled = true ;
259- } else if (jenv->IsInstanceOf (returnValue, jenv->FindClass (" java/lang/Boolean" ))) {
260- jmethodID boolValueMethod = jenv->GetMethodID (cls, " booleanValue" , " ()Z" );
261- jboolean result = jenv->CallBooleanMethod (returnValue, boolValueMethod);
262-
263- Lua::ReturnValues (L, result);
264- handled = true ;
265- }
266-
267- if (jenv->IsInstanceOf (returnValue, jenv->FindClass (" java/util/List" )) || jenv->IsInstanceOf (returnValue, jenv->FindClass (" java/util/ArrayList" ))) {
268- jmethodID sizeMethod = jenv->GetMethodID (cls, " size" , " ()I" );
269- jmethodID getMethod = jenv->GetMethodID (cls, " get" , " (I)Ljava/lang/Object;" );
270- jint len = jenv->CallIntMethod (returnValue, sizeMethod);
271-
272- Lua::LuaTable_t table (new Lua::LuaTable);
273-
274- for (jint i = 0 ; i < len; i++) {
275- jobject arrayElement = jenv->CallObjectMethod (returnValue, getMethod, i);
276-
277- if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/String" ))) {
278- jstring element = (jstring)arrayElement;
279- const char * pchars = jenv->GetStringUTFChars (element, nullptr );
280-
281- table->Add (i + 1 , pchars);
282- jenv->ReleaseStringUTFChars (element, pchars);
283- jenv->DeleteLocalRef (element);
284- } else if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/Integer" ))) {
285- jmethodID intValueMethod = jenv->GetMethodID (jenv->GetObjectClass (arrayElement), " intValue" , " ()I" );
286- jint result = jenv->CallIntMethod (arrayElement, intValueMethod);
287-
288- table->Add (i + 1 , result);
289- } else if (jenv->IsInstanceOf (arrayElement, jenv->FindClass (" java/lang/Boolean" ))) {
290- jmethodID boolValueMethod = jenv->GetMethodID (jenv->GetObjectClass (arrayElement), " booleanValue" , " ()Z" );
291- jboolean result = jenv->CallBooleanMethod (arrayElement, boolValueMethod);
292-
293- table->Add (i + 1 , result);
294- }
284+ Lua::LuaValue value = Plugin::Get ()->ToLuaValue (jenv, returnValue);
285+
286+ if (!(value == NULL )) {
287+ switch (value.GetType ())
288+ {
289+ case Lua::LuaValue::Type::STRING:
290+ Lua::ReturnValues (L, value.GetValue <std::string>().c_str ());
291+ break ;
292+ case Lua::LuaValue::Type::INTEGER:
293+ Lua::ReturnValues (L, value.GetValue <int >());
294+ break ;
295+ case Lua::LuaValue::Type::BOOLEAN:
296+ Lua::ReturnValues (L, value.GetValue <bool >());
297+ break ;
298+ case Lua::LuaValue::Type::TABLE:
299+ Lua::ReturnValues (L, value.GetValue <Lua::LuaTable_t>());
300+ break ;
295301 }
296-
297- Lua::ReturnValues (L, table);
298- handled = true ;
299302 }
300303 }
304+ else {
305+ Lua::ReturnValues (L, 1 );
306+ }
301307
302- if (!handled) Lua::ReturnValues (L, 1 );
303308 return 1 ;
304309 });
305310}
0 commit comments