Exemplo n.º 1
0
  // 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;
  }
Exemplo n.º 2
0
  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;
  }