diff --git a/build/project-template/custom_rules.xml b/build/project-template/custom_rules.xml index 999b13a63..882c089d9 100644 --- a/build/project-template/custom_rules.xml +++ b/build/project-template/custom_rules.xml @@ -24,43 +24,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + Resolving Android.jar and Build Target for ${ant.project.name}... + + + + + + + + Using android.jar from ${project.target.android.jar} + + + + + - - - - - - - - - - @@ -86,7 +79,7 @@ - + - + diff --git a/src/jni/NativeScriptRuntime.cpp b/src/jni/NativeScriptRuntime.cpp index 9b39ef75d..f9cba2689 100644 --- a/src/jni/NativeScriptRuntime.cpp +++ b/src/jni/NativeScriptRuntime.cpp @@ -198,30 +198,67 @@ void NativeScriptRuntime::CallJavaMethod(const Handle& caller, const str if ((entry != nullptr) && entry->isResolved) { isStatic = entry->isStatic; + if (entry->memberId == nullptr) { entry->clazz = env.FindClass(className); if (entry->clazz == nullptr) { - DEBUG_WRITE("Cannot resolve class=%s while calling method %s", className.c_str(), methodName.c_str()); + MetadataNode* callerNode = MetadataNode::GetNodeFromHandle(caller); + const string callerClassName = callerNode->GetName(); + + DEBUG_WRITE("Cannot resolve class: %s while calling method: %s callerClassName: %s", className.c_str(), methodName.c_str(), callerClassName.c_str()); + clazz = env.FindClass(callerClassName); + if (clazz == nullptr) + { + ASSERT_FAIL("Cannot resolve caller's class name: %s", callerClassName.c_str()); + return; + } + + mid = isStatic ? + env.GetStaticMethodID(clazz, methodName, entry->sig) : + env.GetMethodID(clazz, methodName, entry->sig); + } + else + { + entry->memberId = isStatic ? + env.GetStaticMethodID(entry->clazz, methodName, entry->sig) : + env.GetMethodID(entry->clazz, methodName, entry->sig); + + if (entry->memberId == nullptr) + { + ASSERT_FAIL("Cannot resolve a method %s on class: %s", methodName.c_str(), className.c_str()); + return; + } } + } - entry->memberId = isStatic - ? env.GetStaticMethodID(entry->clazz, methodName, entry->sig) - : env.GetMethodID(entry->clazz, methodName, entry->sig); + if (entry->clazz != nullptr) + { + clazz = entry->clazz; + mid = reinterpret_cast(entry->memberId); } - clazz = entry->clazz; - mid = reinterpret_cast(entry->memberId); + sig = entry->sig; } else { + DEBUG_WRITE("Resolving method: %s.%s on className %s", className.c_str(), methodName.c_str(), className.c_str()); auto mi = MethodCache::ResolveMethodSignature(className, methodName, args, isStatic); if (mi.mid == nullptr) { - DEBUG_WRITE("Cannot resolve class=%s, method=%s, isStatic=%d, isSuper=%d", className.c_str(), methodName.c_str(), isStatic, isSuper); - return; + MetadataNode* callerNode = MetadataNode::GetNodeFromHandle(caller); + const string callerClassName = callerNode->GetName(); + DEBUG_WRITE("Resolving method on callers class: %s.%s on className %s", callerClassName.c_str(), methodName.c_str(), className.c_str()); + mi = MethodCache::ResolveMethodSignature(callerClassName, methodName, args, isStatic); + if (mi.mid == nullptr) + { + 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()); + APP_FAIL("Cannot resolve class"); + return; + } } + clazz = mi.clazz; mid = mi.mid; sig = mi.signature;