@@ -197,35 +197,95 @@ 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
+ DEBUG_WRITE (" 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
+ if (mid == nullptr )
222
+ {
223
+ DEBUG_WRITE (" Cannot resolve a method %s on caller class: %s" , methodName.c_str (), callerClassName.c_str ());
224
+ return ;
225
+ }
226
+
206
227
}
228
+ else
229
+ {
230
+ entry->memberId = isStatic ?
231
+ env.GetStaticMethodID (entry->clazz , methodName, entry->sig ) :
232
+ env.GetMethodID (entry->clazz , methodName, entry->sig );
233
+
234
+ if (entry->memberId == nullptr )
235
+ {
236
+ DEBUG_WRITE (" Cannot resolve a method %s on class: %s" , methodName.c_str (), className.c_str ());
237
+ return ;
238
+ }
239
+ }
240
+ }
207
241
208
- entry->memberId = isStatic
209
- ? env.GetStaticMethodID (entry->clazz , methodName, entry->sig )
210
- : env.GetMethodID (entry->clazz , methodName, entry->sig );
242
+ if (entry->clazz != nullptr )
243
+ {
244
+ clazz = entry->clazz ;
245
+ mid = reinterpret_cast <jmethodID>(entry->memberId );
211
246
}
212
- clazz = entry->clazz ;
213
- mid = reinterpret_cast <jmethodID>(entry->memberId );
247
+
214
248
sig = entry->sig ;
215
249
}
216
250
else
217
251
{
218
- auto mi = MethodCache::ResolveMethodSignature (className, methodName, args, isStatic);
219
- if (mi.mid == nullptr )
252
+ DEBUG_WRITE (" Resolving method: %s on className %s" , methodName.c_str (), className.c_str ());
253
+ MethodCache::CacheMethodInfo mi;
254
+
255
+ clazz = env.FindClass (className);
256
+ if (clazz != nullptr )
220
257
{
221
- DEBUG_WRITE (" Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d" , className.c_str (), methodName.c_str (), isStatic, isSuper);
222
- return ;
258
+ mi = MethodCache::ResolveMethodSignature (className, methodName, args, isStatic);
259
+ if (mi.mid == nullptr )
260
+ {
261
+ DEBUG_WRITE (" Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d" , className.c_str (), methodName.c_str (), isStatic, isSuper);
262
+ return ;
263
+ }
223
264
}
265
+ else
266
+ {
267
+ MetadataNode* callerNode = MetadataNode::GetNodeFromHandle (caller);
268
+ const string callerClassName = callerNode->GetName ();
269
+ DEBUG_WRITE (" Resolving method on caller class: %s.%s on className %s" , callerClassName.c_str (), methodName.c_str (), className.c_str ());
270
+ mi = MethodCache::ResolveMethodSignature (callerClassName, methodName, args, isStatic);
271
+ if (mi.mid == nullptr )
272
+ {
273
+ DEBUG_WRITE (" Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d, callerClass=%s" , className.c_str (), methodName.c_str (), isStatic, isSuper, callerClassName.c_str ());
274
+ return ;
275
+ }
276
+ }
277
+
278
+
224
279
clazz = mi.clazz ;
225
280
mid = mi.mid ;
226
281
sig = mi.signature ;
227
282
}
228
283
284
+
285
+
286
+
287
+
288
+
229
289
if (!isStatic)
230
290
{
231
291
DEBUG_WRITE (" CallJavaMethod called %s.%s. Instance id: %d, isSuper=%d" , className.c_str (), methodName.c_str (), caller.IsEmpty () ? -42 : caller->GetIdentityHash (), isSuper);
0 commit comments