@@ -197,30 +197,67 @@ void NativeScriptRuntime::CallJavaMethod(const Handle<Object>& caller, const str
197
197
if ((entry != nullptr ) && entry->isResolved )
198
198
{
199
199
isStatic = entry->isStatic ;
200
+
200
201
if (entry->memberId == nullptr )
201
202
{
202
203
entry->clazz = env.FindClass (className);
203
204
if (entry->clazz == nullptr )
204
205
{
205
- DEBUG_WRITE (" Cannot resolve class=%s while calling method %s" , className.c_str (), methodName.c_str ());
206
+ MetadataNode* callerNode = MetadataNode::GetNodeFromHandle (caller);
207
+ const string callerClassName = callerNode->GetName ();
208
+
209
+ DEBUG_WRITE (" Cannot resolve class: %s while calling method: %s callerClassName: %s" , className.c_str (), methodName.c_str (), callerClassName.c_str ());
210
+ clazz = env.FindClass (callerClassName);
211
+ if (clazz == nullptr )
212
+ {
213
+ ASSERT_FAIL (" Cannot resolve caller's class name: %s" , callerClassName.c_str ());
214
+ return ;
215
+ }
216
+
217
+ mid = isStatic ?
218
+ env.GetStaticMethodID (clazz, methodName, entry->sig ) :
219
+ env.GetMethodID (clazz, methodName, entry->sig );
220
+ }
221
+ else
222
+ {
223
+ entry->memberId = isStatic ?
224
+ env.GetStaticMethodID (entry->clazz , methodName, entry->sig ) :
225
+ env.GetMethodID (entry->clazz , methodName, entry->sig );
226
+
227
+ if (entry->memberId == nullptr )
228
+ {
229
+ ASSERT_FAIL (" Cannot resolve a method %s on class: %s" , methodName.c_str (), className.c_str ());
230
+ return ;
231
+ }
206
232
}
233
+ }
207
234
208
- entry->memberId = isStatic
209
- ? env.GetStaticMethodID (entry->clazz , methodName, entry->sig )
210
- : env.GetMethodID (entry->clazz , methodName, entry->sig );
235
+ if (entry->clazz != nullptr )
236
+ {
237
+ clazz = entry->clazz ;
238
+ mid = reinterpret_cast <jmethodID>(entry->memberId );
211
239
}
212
- clazz = entry->clazz ;
213
- mid = reinterpret_cast <jmethodID>(entry->memberId );
240
+
214
241
sig = entry->sig ;
215
242
}
216
243
else
217
244
{
245
+ DEBUG_WRITE (" Resolving method: %s.%s on className %s" , className.c_str (), methodName.c_str (), className.c_str ());
218
246
auto mi = MethodCache::ResolveMethodSignature (className, methodName, args, isStatic);
219
247
if (mi.mid == nullptr )
220
248
{
221
- DEBUG_WRITE (" Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d" , className.c_str (), methodName.c_str (), isStatic, isSuper);
222
- return ;
249
+ MetadataNode* callerNode = MetadataNode::GetNodeFromHandle (caller);
250
+ const string callerClassName = callerNode->GetName ();
251
+ DEBUG_WRITE (" Resolving method on callers class: %s.%s on className %s" , callerClassName.c_str (), methodName.c_str (), className.c_str ());
252
+ mi = MethodCache::ResolveMethodSignature (callerClassName, methodName, args, isStatic);
253
+ if (mi.mid == nullptr )
254
+ {
255
+ 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 ());
256
+ APP_FAIL (" Cannot resolve class" );
257
+ return ;
258
+ }
223
259
}
260
+
224
261
clazz = mi.clazz ;
225
262
mid = mi.mid ;
226
263
sig = mi.signature ;
0 commit comments