// Packages args in format (typeID, value, null) except for objects where it // is // (typeid, javaObjectID, canonicalName) // if javaObject has no javaObjecID meaning javascript object does not // exists for this object we assign one. static Object[] packageArgs(Object... args) { int len = (args != null) ? (args.length * 3) : 0; Object[] packagedArgs = new Object[len]; if (len > 0) { int jsArgsIndex = 0; for (int i = 0; i < args.length; i++) { Object value = args[i]; int typeId = TypeIDs.GetObjectTypeId(value); String javaClassPath = null; if (typeId == TypeIDs.JsObject) { javaClassPath = value.getClass().getName(); value = getorCreateJavaObjectID(value); } packagedArgs[jsArgsIndex++] = typeId; packagedArgs[jsArgsIndex++] = value; packagedArgs[jsArgsIndex++] = javaClassPath; } } return packagedArgs; }
private static Object dispatchCallJSMethodNative( final int javaObjectID, final String methodName, boolean isConstructor, long delay, Class<?> retType, final Object[] args) throws NativeScriptException { final int returnType = TypeIDs.GetObjectTypeId(retType); Object ret = null; boolean isMainThread = mainThread.equals(Thread.currentThread()); final Object[] tmpArgs = extendConstructorArgs(methodName, isConstructor, args); if (isMainThread) { Object[] packagedArgs = packageArgs(tmpArgs); ret = callJSMethodNative(javaObjectID, methodName, returnType, isConstructor, packagedArgs); } else { Handler mainThreadHandler = new Handler(Looper.getMainLooper()); final Object[] arr = new Object[2]; final boolean isCtor = isConstructor; Runnable r = new Runnable() { @Override public void run() { synchronized (this) { try { final Object[] packagedArgs = packageArgs(tmpArgs); arr[0] = callJSMethodNative( javaObjectID, methodName, returnType, isCtor, packagedArgs); } finally { this.notify(); arr[1] = Boolean.TRUE; } } } }; if (delay > 0) { try { Thread.sleep(delay); } catch (InterruptedException e) { } } boolean success = mainThreadHandler.post(r); if (success) { synchronized (r) { try { if (arr[1] == null) { r.wait(); } } catch (InterruptedException e) { ret = e; } } } ret = arr[0]; } return ret; }