Skip to content

Commit 7573791

Browse files
committed
fix for method resolving when class hierarchy is not the same as in the MetadataNode
do not set the memberId when the class of the MetadataEntry is not found
1 parent c7bbabb commit 7573791

File tree

1 file changed

+77
-10
lines changed

1 file changed

+77
-10
lines changed

src/jni/NativeScriptRuntime.cpp

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ void NativeScriptRuntime::CallJavaMethod(const Handle<Object>& caller, const str
198198
if ((entry != nullptr) && entry->isResolved)
199199
{
200200
isStatic = entry->isStatic;
201+
201202
if (entry->memberId == nullptr)
202203
{
203204
entry->clazz = env.FindClass(className);
@@ -206,31 +207,97 @@ void NativeScriptRuntime::CallJavaMethod(const Handle<Object>& caller, const str
206207
MetadataNode* callerNode = MetadataNode::GetNodeFromHandle(caller);
207208
const string callerClassName = callerNode->GetName();
208209

209-
DEBUG_WRITE("Cannot resolve class: %s while calling method: %s callerNode: %s", className.c_str(), methodName.c_str(), callerNode->GetName().c_str());
210-
entry->clazz = env.FindClass(callerClassName);
211-
if (entry->clazz == nullptr)
210+
DEBUG_WRITE("Cannot resolve class: %s while calling method: %s callerClassName: %s", className.c_str(), methodName.c_str(), callerClassName.c_str());
211+
clazz = env.FindClass(callerClassName);
212+
if (clazz == nullptr)
212213
{
213214
ASSERT_FAIL("Cannot resolve caller's class name: %s", callerClassName.c_str());
214215
APP_FAIL("Cannot resolve caller's class name");
216+
return;
215217
}
218+
219+
mid = isStatic ?
220+
env.GetStaticMethodID(clazz, methodName, entry->sig) :
221+
env.GetMethodID(clazz, methodName, entry->sig);
222+
}
223+
else
224+
{
225+
entry->memberId = isStatic ?
226+
env.GetStaticMethodID(entry->clazz, methodName, entry->sig) :
227+
env.GetMethodID(entry->clazz, methodName, entry->sig);
216228
}
217229

218-
entry->memberId = isStatic
219-
? env.GetStaticMethodID(entry->clazz, methodName, entry->sig)
220-
: env.GetMethodID(entry->clazz, methodName, entry->sig);
230+
231+
}
232+
233+
if (entry->clazz != nullptr)
234+
{
235+
clazz = entry->clazz;
236+
mid = reinterpret_cast<jmethodID>(entry->memberId);
221237
}
222-
clazz = entry->clazz;
223-
mid = reinterpret_cast<jmethodID>(entry->memberId);
238+
224239
sig = entry->sig;
240+
241+
242+
// if (entry->memberId == nullptr)
243+
// {
244+
// entry->clazz = env.FindClass(className);
245+
// if (entry->clazz == nullptr)
246+
// {
247+
// MetadataNode* callerNode = MetadataNode::GetNodeFromHandle(caller);
248+
// const string callerClassName = callerNode->GetName();
249+
//
250+
// DEBUG_WRITE("Cannot resolve class: %s while calling method: %s callerClassName: %s", className.c_str(), methodName.c_str(), callerClassName.c_str());
251+
// clazz = env.FindClass(callerClassName);
252+
// if (clazz == nullptr)
253+
// {
254+
// ASSERT_FAIL("Cannot resolve caller's class name: %s", callerClassName.c_str());
255+
// APP_FAIL("Cannot resolve caller's class name");
256+
// return;
257+
// }
258+
// }
259+
// else
260+
// {
261+
// clazz = entry->clazz;
262+
// }
263+
//
264+
// entry->memberId = isStatic ?
265+
// env.GetStaticMethodID(clazz, methodName, entry->sig) :
266+
// env.GetMethodID(clazz, methodName, entry->sig);
267+
// }
268+
//
269+
// if (entry->clazz != nullptr)
270+
// {
271+
// clazz = entry->clazz;
272+
// }
273+
//
274+
// mid = reinterpret_cast<jmethodID>(entry->memberId);
275+
// sig = entry->sig;
225276
}
226277
else
227278
{
279+
//nameri pravilnia klass koito e definiral tova ime za tekustata platforma
280+
//spesti resolvemethod call ako clasa s ime className go niama i tarsi napravo ot object na dolu koi e definiral tozi method i
281+
//vikai resolve na nego
282+
//sled tova zapazi v entrito na metoda koi e iskinskia className. to realno parametara classname idva nai veroiatno ot entrito
283+
//prosto mu smeni imeto
284+
285+
DEBUG_WRITE("Resolving method: %s.%s on className %s", className.c_str(), methodName.c_str(), className.c_str());
228286
auto mi = MethodCache::ResolveMethodSignature(className, methodName, args, isStatic);
229287
if (mi.mid == nullptr)
230288
{
231-
DEBUG_WRITE("Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d", className.c_str(), methodName.c_str(), isStatic, isSuper);
232-
return;
289+
MetadataNode* callerNode = MetadataNode::GetNodeFromHandle(caller);
290+
const string callerClassName = callerNode->GetName();
291+
DEBUG_WRITE("Resolving method on callers class: %s.%s on className %s", callerClassName.c_str(), methodName.c_str(), className.c_str());
292+
mi = MethodCache::ResolveMethodSignature(callerClassName, methodName, args, isStatic);
293+
if (mi.mid == nullptr)
294+
{
295+
ASSERT_FAIL("Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d, callerClass=%s", className.c_str(), methodName.c_str(), isStatic, isSuper, callerClassName.c_str());
296+
APP_FAIL("Cannot resolve class");
297+
return;
298+
}
233299
}
300+
234301
clazz = mi.clazz;
235302
mid = mi.mid;
236303
sig = mi.signature;

0 commit comments

Comments
 (0)