Skip to content

Commit 81ba09d

Browse files
committed
Use recursion on tables/maps/lists to fully convert
1 parent a17b70b commit 81ba09d

File tree

2 files changed

+114
-106
lines changed

2 files changed

+114
-106
lines changed

src/Plugin.cpp

Lines changed: 111 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
54143
void 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
}

src/Plugin.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,7 @@ class Plugin : public Singleton<Plugin>
3535
void DestroyJava(int id);
3636
JavaVM* GetJavaVM(int id);
3737
JNIEnv* GetJavaEnv(int id);
38+
39+
jobject ToJavaObject(JNIEnv* jenv, Lua::LuaValue value);
40+
Lua::LuaValue ToLuaValue(JNIEnv* jenv, jobject object);
3841
};

0 commit comments

Comments
 (0)