/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// This file is autogenerated by
//     incubator-weex/weex_core/Source/android/jniprebuild/jni_generator.py
// For
//     org/apache/weex/bridge/WXBridge

#ifndef com_taobao_weex_bridge_WXBridge_JNI
#define com_taobao_weex_bridge_WXBridge_JNI

#include <jni.h>
#include "base/android/jni/android_jni.h"

//#include "base/android/jni_int_wrapper.h"

// Step 1: forward declarations.
namespace {
const char kWXBridgeClassPath[] = "org/apache/weex/bridge/WXBridge";
// Leaking this jclass as we cannot use LazyInstance from some threads.
jclass g_WXBridge_clazz = NULL;
#define WXBridge_clazz(env) g_WXBridge_clazz

}  // namespace

static jint InitFrameworkEnv(JNIEnv *env, jobject jcaller,
                             jstring framework,
                             jobject params,
                             jstring cacheDir,
                             jboolean pieSupport);

static jint InitFramework(JNIEnv *env, jobject jcaller,
                          jstring framework,
                          jobject params);

static void RefreshInstance(JNIEnv *env, jobject jcaller,
                            jstring instanceId,
                            jstring _namespace,
                            jstring function,
                            jobjectArray args);

static jint ExecJS(JNIEnv *env, jobject jcaller,
                   jstring instanceId,
                   jstring name,
                   jstring function,
                   jobjectArray args);

static jint ExecJSService(JNIEnv *env, jobject jcaller,
                          jstring javascript);

static void ExecJSWithCallback(JNIEnv *env, jobject jcaller,
                               jstring instanceId,
                               jstring _namespace,
                               jstring _function,
                               jobjectArray args,
                               jlong callbackId);

static jint CreateInstanceContext(JNIEnv *env, jobject jcaller,
                                  jstring instanceId,
                                  jstring name,
                                  jstring function,
                                  jobjectArray args);

static jint DestoryInstance(JNIEnv *env, jobject jcaller,
                            jstring instanceId,
                            jstring name,
                            jstring function,
                            jobjectArray args);

static jstring ExecJSOnInstance(JNIEnv *env, jobject jcaller,
                                jstring instanceId,
                                jstring script,
                                jint type);

static void onInteractionTimeUpdate(JNIEnv *env, jobject jcaller, jstring instanceId);

static void FireEventOnDataRenderNode(JNIEnv *env, jobject jcaller,
                                      jstring instanceId,
                                      jstring ref,
                                      jstring type,
                                      jstring data,
                                      jstring domChanges);

static void InvokeCallbackOnDataRender(JNIEnv *env, jobject jcaller,
                                       jstring instanceId,
                                       jstring callbackId,
                                       jstring data,
                                       jboolean keepAlive);

static void RegisterModuleOnDataRenderNode(JNIEnv *env, jobject jcaller,
                                           jstring data);

static void RegisterComponentOnDataRenderNode(JNIEnv *env, jobject jcaller,
                                              jstring data);
static void TakeHeapSnapshot(JNIEnv *env, jobject jcaller,
                             jstring filename);

static void BindMeasurementToRenderObject(JNIEnv *env, jobject jcaller,
                                          jlong ptr);

static void SetRenderContainerWrapContent(JNIEnv *env, jobject jcaller,
                                          jboolean wrap,
                                          jstring instanceId);

static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller,
                                           jstring instanceId);

static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller,
                                      jstring instanceId);

static void SetDefaultHeightAndWidthIntoRootDom(JNIEnv *env, jobject jcaller,
                                                jstring instanceId,
                                                jfloat defaultWidth,
                                                jfloat defaultHeight,
                                                jboolean isWidthWrapContent,
                                                jboolean isHeightWrapContent);

static void OnInstanceClose(JNIEnv *env, jobject jcaller,
                            jstring instanceId);

static void ForceLayout(JNIEnv *env, jobject jcaller,
                        jstring instanceId);

static jboolean NotifyLayout(JNIEnv *env, jobject jcaller,
                             jstring instanceId);

static void SetStyleWidth(JNIEnv *env, jobject jcaller,
                          jstring instanceId,
                          jstring ref,
                          jfloat value);

static void SetStyleHeight(JNIEnv *env, jobject jcaller,
                           jstring instanceId,
                           jstring ref,
                           jfloat value);

static void SetMargin(JNIEnv *env, jobject jcaller,
                      jstring instanceId,
                      jstring ref,
                      jint edge,
                      jfloat value);

static void SetPadding(JNIEnv *env, jobject jcaller,
                       jstring instanceId,
                       jstring ref,
                       jint edge,
                       jfloat value);

static void SetPosition(JNIEnv *env, jobject jcaller,
                        jstring instanceId,
                        jstring ref,
                        jint edge,
                        jfloat value);

static void MarkDirty(JNIEnv *env, jobject jcaller,
                      jstring instanceId,
                      jstring ref,
                      jboolean dirty);

static void SetDeviceDisplay(JNIEnv *env, jobject jcaller,
                             jstring instanceId, jfloat width, jfloat height, jfloat scale);

static void RegisterCoreEnv(JNIEnv *env, jobject jcaller,
                            jstring key,
                            jstring value);

static void ResetWXBridge(JNIEnv *env, jobject jcaller,
                          jobject bridge,
                          jstring className);

static void UpdateInitFrameworkParams(JNIEnv *env, jobject jcaller,
                                      jstring key,
                                      jstring value,
                                      jstring desc);

static void UpdateGlobalConfig(JNIEnv *env, jobject jcaller,
                               jstring config);

static void SetInstanceRenderType(JNIEnv *env, jobject jcaller,
                                  jstring instanceId,
                                  jstring renderType);

static void RemoveInstanceRenderType(JNIEnv *env, jobject jcaller,
                                     jstring instanceId);

static void SetViewPortWidth(JNIEnv *env, jobject jcaller,
                             jstring instanceId, jfloat viewPortWidth);

static void SetPageArgument(JNIEnv *env, jobject jcaller,
                            jstring instanceId,
                            jstring key,
                            jstring value);

static void SetLogType(JNIEnv* env, jobject jcaller, jfloat type,
                       jfloat isPerf);

static jstring nativeDumpIpcPageQueueInfo(JNIEnv* env, jobject jcaller);
static void ReloadPageLayout(JNIEnv *env, jobject jcaller,
                             jstring instanceId);
static void SetDeviceDisplayOfPage(JNIEnv *env, jobject jcaller,
                                   jstring instanceId,jfloat width,jfloat height);


// Step 2: method stubs.

static intptr_t g_WXBridge_onReceivedResult = 0;
static void Java_WXBridge_onReceivedResult(JNIEnv *env, jobject obj, jlong
callbackId,
                                           jbyteArray result) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "onReceivedResult",

          "("
          "J"
          "[B"
          ")"
          "V",
          &g_WXBridge_onReceivedResult);

  env->CallVoidMethod(obj,
                      method_id, callbackId, result);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_callNative = 0;
static jint Java_WXBridge_callNative(JNIEnv *env, jobject obj, jstring
instanceId,
                                     jbyteArray tasks,
                                     jstring callback) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callNative",

          "("
          "Ljava/lang/String;"
          "[B"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callNative);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, tasks, callback);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_reportJSException = 0;
static void Java_WXBridge_reportJSException(JNIEnv *env, jobject obj, jstring
instanceId,
                                            jstring func,
                                            jstring exception) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "reportJSException",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "V",
          &g_WXBridge_reportJSException);

  env->CallVoidMethod(obj,
                      method_id, instanceId, func, exception);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_callNativeModule = 0;
static base::android::ScopedLocalJavaRef<jobject>
Java_WXBridge_callNativeModule(JNIEnv *env, jobject obj, jstring instanceId,
                               jstring module,
                               jstring method,
                               jbyteArray arguments,
                               jbyteArray options) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), NULL);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callNativeModule",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "[B"
          "[B"
          ")"
          "Ljava/lang/Object;",
          &g_WXBridge_callNativeModule);

  jobject ret =
      env->CallObjectMethod(obj,
                            method_id, instanceId, module, method, arguments, options);
  base::android::CheckException(env);
  return base::android::ScopedLocalJavaRef<jobject>(env, ret);
}

static intptr_t g_WXBridge_callNativeComponent = 0;
static void Java_WXBridge_callNativeComponent(JNIEnv *env, jobject obj, jstring
instanceId,
                                              jstring ref,
                                              jstring method,
                                              jbyteArray arguments,
                                              jbyteArray optionsData) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callNativeComponent",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "[B"
          "[B"
          ")"
          "V",
          &g_WXBridge_callNativeComponent);

  env->CallVoidMethod(obj,
                      method_id, instanceId, ref, method, arguments, optionsData);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_setPageDirty = 0;
static void Java_WXBridge_setPageDirty(JNIEnv *env, jobject obj, jstring
page_id, jboolean dirty) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "setPageDirty",
          "("
          "Ljava/lang/String;"
          "Z"
          ")"
          "V",
          &g_WXBridge_setPageDirty);

  env->CallVoidMethod(obj,
                      method_id, page_id, dirty);
  base::android::CheckException(env);
}


static intptr_t g_WXBridge_setTimeoutNative = 0;
static void Java_WXBridge_setTimeoutNative(JNIEnv *env, jobject obj, jstring
callbackId,
                                           jstring time) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "setTimeoutNative",
          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "V",
          &g_WXBridge_setTimeoutNative);

  env->CallVoidMethod(obj,
                      method_id, callbackId, time);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_setJSFrmVersion = 0;
static void Java_WXBridge_setJSFrmVersion(JNIEnv *env, jobject obj, jstring
version) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "setJSFrmVersion",

          "("
          "Ljava/lang/String;"
          ")"
          "V",
          &g_WXBridge_setJSFrmVersion);

  env->CallVoidMethod(obj,
                      method_id, version);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_callUpdateFinish = 0;
static jint Java_WXBridge_callUpdateFinish(JNIEnv *env, jobject obj, jstring
instanceId,
                                           jbyteArray tasks,
                                           jstring callback) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callUpdateFinish",

          "("
          "Ljava/lang/String;"
          "[B"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callUpdateFinish);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, tasks, callback);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callRefreshFinish = 0;
static jint Java_WXBridge_callRefreshFinish(JNIEnv *env, jobject obj, jstring
instanceId,
                                            jbyteArray tasks,
                                            jstring callback) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callRefreshFinish",

          "("
          "Ljava/lang/String;"
          "[B"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callRefreshFinish);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, tasks, callback);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_reportServerCrash = 0;
static void Java_WXBridge_reportServerCrash(JNIEnv *env, jobject obj, jstring
instanceId,
                                            jstring crashFile) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "reportServerCrash",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "V",
          &g_WXBridge_reportServerCrash);

  env->CallVoidMethod(obj,
                      method_id, instanceId, crashFile);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_callCreateBody = 0;
static jint Java_WXBridge_callCreateBody(JNIEnv *env, jobject obj, jstring
instanceId,
                                         jstring componentType,
                                         jstring ref,
                                         jobject styles,
                                         jobject attributes,
                                         jobject events,
                                         jfloatArray margins,
                                         jfloatArray paddings,
                                         jfloatArray borders) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callCreateBody",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashSet;"
          "[F"
          "[F"
          "[F"
          ")"
          "I",
          &g_WXBridge_callCreateBody);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, componentType, ref, styles, attributes, events,
                         margins, paddings, borders);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callAddElement = 0;
static jint Java_WXBridge_callAddElement(JNIEnv *env, jobject obj, jstring
instanceId,
                                         jstring componentType,
                                         jstring ref,
                                         int index,
                                         jstring parentRef,
                                         jobject styles,
                                         jobject attributes,
                                         jobject events,
                                         jfloatArray margins,
                                         jfloatArray paddings,
                                         jfloatArray borders,
                                         jboolean willLayout) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callAddElement",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "I"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashSet;"
          "[F"
          "[F"
          "[F"
          "Z"
          ")"
          "I",
          &g_WXBridge_callAddElement);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, componentType, ref, int(index), parentRef,
                         styles, attributes, events, margins, paddings, borders,
                         willLayout);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callRemoveElement = 0;
static jint Java_WXBridge_callRemoveElement(JNIEnv *env, jobject obj, jstring
instanceId,
                                            jstring ref) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callRemoveElement",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callRemoveElement);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callMoveElement = 0;
static jint Java_WXBridge_callMoveElement(JNIEnv *env, jobject obj, jstring
instanceId,
                                          jstring ref,
                                          jstring parentref,
                                          int index) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callMoveElement",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "I"
          ")"
          "I",
          &g_WXBridge_callMoveElement);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, parentref, int(index));
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callAddEvent = 0;
static jint Java_WXBridge_callAddEvent(JNIEnv *env, jobject obj, jstring
instanceId,
                                       jstring ref,
                                       jstring event) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callAddEvent",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callAddEvent);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, event);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callRemoveEvent = 0;
static jint Java_WXBridge_callRemoveEvent(JNIEnv *env, jobject obj, jstring
instanceId,
                                          jstring ref,
                                          jstring event) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callRemoveEvent",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callRemoveEvent);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, event);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callUpdateStyle = 0;
static jint Java_WXBridge_callUpdateStyle(JNIEnv *env, jobject obj, jstring
instanceId,
                                          jstring ref,
                                          jobject styles,
                                          jobject paddings,
                                          jobject margins,
                                          jobject borders) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callUpdateStyle",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          ")"
          "I",
          &g_WXBridge_callUpdateStyle);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, styles, paddings, margins, borders);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callUpdateAttrs = 0;
static jint Java_WXBridge_callUpdateAttrs(JNIEnv *env, jobject obj, jstring
instanceId,
                                          jstring ref,
                                          jobject attrs) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callUpdateAttrs",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          ")"
          "I",
          &g_WXBridge_callUpdateAttrs);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, attrs);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callAddChildToRichtext = 0;
static jint Java_WXBridge_callAddChildToRichtext(JNIEnv *env,
                                                 jobject obj,
                                                 jstring instanceId,
                                                 jstring nodeType,
                                                 jstring ref,
                                                 jstring parentRef,
                                                 jstring richtextRef,
                                                 jobject styles,
                                                 jobject attrs) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callAddChildToRichtext",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/util/HashMap;"
          ")"
          "I",
          &g_WXBridge_callAddChildToRichtext);

  jint ret =
      env->CallIntMethod(obj,
                         method_id,
                         instanceId,
                         nodeType,
                         ref,
                         parentRef,
                         richtextRef,
                         styles,
                         attrs);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callRemoveChildFromRichtext = 0;
static jint Java_WXBridge_callRemoveChildFromRichtext(JNIEnv *env, jobject obj, jstring instanceId,
                                                      jstring ref,
                                                      jstring parentRef,
                                                      jstring richtextRef) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callRemoveChildFromRichtext",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callRemoveChildFromRichtext);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, parentRef, richtextRef);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callUpdateRichtextStyle = 0;
static jint Java_WXBridge_callUpdateRichtextStyle(JNIEnv *env, jobject obj, jstring instanceId,
                                                  jstring ref,
                                                  jobject styles,
                                                  jstring parentRef,
                                                  jstring richtextRef) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callUpdateRichtextStyle",
          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callUpdateRichtextStyle);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, styles, parentRef, richtextRef);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callUpdateRichtextChildAttr = 0;
static jint Java_WXBridge_callUpdateRichtextChildAttr(JNIEnv *env, jobject obj, jstring instanceId,
                                                      jstring ref,
                                                      jobject attrs,
                                                      jstring parentRef,
                                                      jstring richtextRef) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callUpdateRichtextChildAttr",
          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callUpdateRichtextChildAttr);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, attrs, parentRef, richtextRef);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callLayout = 0;
static jint Java_WXBridge_callLayout(JNIEnv *env, jobject obj, jstring
instanceId,
                                     jstring ref,
                                     int top,
                                     int bottom,
                                     int left,
                                     int right,
                                     int height,
                                     int width,
                                     bool isRTL,
                                     int index) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callLayout",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "I"
          "I"
          "I"
          "I"
          "I"
          "I"
          "Z"
          "I"
          ")"
          "I",
          &g_WXBridge_callLayout);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, int(top), int(bottom), int(left),
                         int(right), int(height), int(width), isRTL, int(index));
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callCreateFinish = 0;
static jint Java_WXBridge_callCreateFinish(JNIEnv *env, jobject obj, jstring
instanceId) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callCreateFinish",

          "("
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callCreateFinish);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callRenderSuccess = 0;
static jint Java_WXBridge_callRenderSuccess(JNIEnv *env, jobject obj, jstring
instanceId) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callRenderSuccess",

          "("
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callRenderSuccess);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callAppendTreeCreateFinish = 0;
static jint Java_WXBridge_callAppendTreeCreateFinish(JNIEnv *env, jobject obj,
                                                     jstring instanceId,
                                                     jstring ref) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callAppendTreeCreateFinish",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "I",
          &g_WXBridge_callAppendTreeCreateFinish);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_callHasTransitionPros = 0;
static jint Java_WXBridge_callHasTransitionPros(JNIEnv *env, jobject obj,
                                                jstring instanceId,
                                                jstring ref,
                                                jobject styles) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), 0);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "callHasTransitionPros",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          "Ljava/util/HashMap;"
          ")"
          "I",
          &g_WXBridge_callHasTransitionPros);

  jint ret =
      env->CallIntMethod(obj,
                         method_id, instanceId, ref, styles);
  base::android::CheckException(env);
  return ret;
}

static intptr_t g_WXBridge_getMeasurementFunc = 0;
static base::android::ScopedLocalJavaRef<jobject>
Java_WXBridge_getMeasurementFunc(JNIEnv *env, jobject obj, jstring
instanceId,
                                 jlong renderObjectPtr) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env), NULL);
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "getMeasurementFunc",

          "("
          "Ljava/lang/String;"
          "J"
          ")"
          "Lorg/apache/weex/layout/ContentBoxMeasurement;",
          &g_WXBridge_getMeasurementFunc);

  jobject ret =
      env->CallObjectMethod(obj,
                            method_id, instanceId, renderObjectPtr);
  base::android::CheckException(env);
  return base::android::ScopedLocalJavaRef<jobject>(env, ret);
}

static intptr_t g_WXBridge_reportNativeInitStatus = 0;
static void Java_WXBridge_reportNativeInitStatus(JNIEnv *env, jobject obj,
                                                 jstring statusCode,
                                                 jstring errorMsg) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "reportNativeInitStatus",

          "("
          "Ljava/lang/String;"
          "Ljava/lang/String;"
          ")"
          "V",
          &g_WXBridge_reportNativeInitStatus);

  env->CallVoidMethod(obj,
                      method_id, statusCode, errorMsg);
  base::android::CheckException(env);

}

static intptr_t g_WXBridge_onNativePerformanceDataUpdate = 0;
static void Java_WXBridge_onNativePerformanceDataUpdate(JNIEnv *env, jobject obj,
                                                        jstring id,
                                                        jobject data) {
  /* Must call RegisterNativesImpl()  */
  //CHECK_CLAZZ(env, obj,
  //    WXBridge_clazz(env));
  jmethodID method_id =
      base::android::GetMethod(
          env, WXBridge_clazz(env),
          base::android::INSTANCE_METHOD,
          "onNativePerformanceDataUpdate",
          "("
          "Ljava/lang/String;"
          "Ljava/util/Map;"
          ")"
          "V",
          &g_WXBridge_onNativePerformanceDataUpdate);

  env->CallVoidMethod(obj,
                      method_id, id, data);
  base::android::CheckException(env);

}

// Step 3: RegisterNatives.

static const JNINativeMethod kMethodsWXBridge[] = {
    {"nativeInitFrameworkEnv",
     "("
     "Ljava/lang/String;"
     "Lorg/apache/weex/bridge/WXParams;"
     "Ljava/lang/String;"
     "Z"
     ")"
     "I", reinterpret_cast<void *>(InitFrameworkEnv)},
    {"nativeInitFramework",
     "("
     "Ljava/lang/String;"
     "Lorg/apache/weex/bridge/WXParams;"
     ")"
     "I", reinterpret_cast<void *>(InitFramework)},
    {"nativeRefreshInstance",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "[Lorg/apache/weex/bridge/WXJSObject;"
     ")"
     "V", reinterpret_cast<void *>(RefreshInstance)},
    {"nativeExecJS",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "[Lorg/apache/weex/bridge/WXJSObject;"
     ")"
     "I", reinterpret_cast<void *>(ExecJS)},
    {"nativeExecJSService",
     "("
     "Ljava/lang/String;"
     ")"
     "I", reinterpret_cast<void *>(ExecJSService)},
    {"nativeExecJSWithCallback",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "[Lorg/apache/weex/bridge/WXJSObject;"
     "J"
     ")"
     "V", reinterpret_cast<void *>(ExecJSWithCallback)},
    {"nativeCreateInstanceContext",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "[Lorg/apache/weex/bridge/WXJSObject;"
     ")"
     "I", reinterpret_cast<void *>(CreateInstanceContext)},
    {"nativeDestoryInstance",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "[Lorg/apache/weex/bridge/WXJSObject;"
     ")"
     "I", reinterpret_cast<void *>(DestoryInstance)},
    {"nativeExecJSOnInstance",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "I"
     ")"
     "Ljava/lang/String;", reinterpret_cast<void *>(ExecJSOnInstance)},
    {"nativeOnInteractionTimeUpdate",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(onInteractionTimeUpdate)},
    {"nativeFireEventOnDataRenderNode",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(FireEventOnDataRenderNode)},
    {"nativeInvokeCallbackOnDataRender",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Z"
     ")"
     "V", reinterpret_cast<void *>(InvokeCallbackOnDataRender)},
    {"nativeRegisterModuleOnDataRenderNode",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(RegisterModuleOnDataRenderNode)},
    {"nativeRegisterComponentOnDataRenderNode",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(RegisterComponentOnDataRenderNode)},
    {"nativeTakeHeapSnapshot",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(TakeHeapSnapshot)},
    {"nativeBindMeasurementToRenderObject",
     "("
     "J"
     ")"
     "V", reinterpret_cast<void *>(BindMeasurementToRenderObject)},
    {"nativeSetRenderContainerWrapContent",
     "("
     "Z"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(SetRenderContainerWrapContent)},
    {"nativeGetFirstScreenRenderTime",
     "("
     "Ljava/lang/String;"
     ")"
     "[J", reinterpret_cast<void *>(GetFirstScreenRenderTime)},
    {"nativeGetRenderFinishTime",
     "("
     "Ljava/lang/String;"
     ")"
     "[J", reinterpret_cast<void *>(GetRenderFinishTime)},
    {"nativeSetDefaultHeightAndWidthIntoRootDom",
     "("
     "Ljava/lang/String;"
     "F"
     "F"
     "Z"
     "Z"
     ")"
     "V", reinterpret_cast<void *>(SetDefaultHeightAndWidthIntoRootDom)},
    {"nativeOnInstanceClose",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(OnInstanceClose)},
    {"nativeForceLayout",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(ForceLayout)},
    {"nativeNotifyLayout",
     "("
     "Ljava/lang/String;"
     ")"
     "Z", reinterpret_cast<void *>(NotifyLayout)},
    {"nativeSetStyleWidth",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetStyleWidth)},
    {"nativeSetStyleHeight",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetStyleHeight)},
    {"nativeSetMargin",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "I"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetMargin)},
    {"nativeSetPadding",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "I"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetPadding)},
    {"nativeSetPosition",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "I"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetPosition)},
    {"nativeMarkDirty",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Z"
     ")"
     "V", reinterpret_cast<void *>(MarkDirty)},
    {"nativeSetDeviceDisplay",
     "("
     "Ljava/lang/String;"
     "F"
     "F"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetDeviceDisplay)},
    {"nativeRegisterCoreEnv",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(RegisterCoreEnv)},
    {"nativeResetWXBridge",
     "("
     "Ljava/lang/Object;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(ResetWXBridge)},
    {"nativeSetPageArgument",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(SetPageArgument)},
    {"nativeUpdateInitFrameworkParams",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(UpdateInitFrameworkParams)},
    {"nativeUpdateGlobalConfig",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(UpdateGlobalConfig)},
    {"nativeSetInstanceRenderType",
     "("
     "Ljava/lang/String;"
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(SetInstanceRenderType)},
    {"nativeRemoveInstanceRenderType",
     "("
     "Ljava/lang/String;"
     ")"
     "V", reinterpret_cast<void *>(RemoveInstanceRenderType)},
    {"nativeSetViewPortWidth",
     "("
     "Ljava/lang/String;"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetViewPortWidth)},
    {"nativeSetLogType",
     "("
     "F"
     "F"
     ")"
     "V", reinterpret_cast<void *>(SetLogType)},
    { "nativeDumpIpcPageQueueInfo",
    "("
    ")"
    "Ljava/lang/String;", reinterpret_cast<void*>(nativeDumpIpcPageQueueInfo) },
    {"nativeReloadPageLayout",
     "("
     "Ljava/lang/String;"
     ")"
     "V",reinterpret_cast<void *>(ReloadPageLayout)},
    {"nativeSetDeviceDisplayOfPage",
    "("
    "Ljava/lang/String;"
    "F"
    "F"
    ")"
    "V",reinterpret_cast<void *>(SetDeviceDisplayOfPage)}
};

static bool RegisterNativesImpl(JNIEnv *env) {

  g_WXBridge_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
      base::android::GetClass(env, kWXBridgeClassPath).Get()));

  const int kMethodsWXBridgeSize =
      sizeof(kMethodsWXBridge) / sizeof(kMethodsWXBridge[0]);

  if (env->RegisterNatives(WXBridge_clazz(env),
                           kMethodsWXBridge,
                           kMethodsWXBridgeSize) < 0) {
    //jni_generator::HandleRegistrationError(
    //    env, WXBridge_clazz(env), __FILE__);
    return false;
  }

  return true;
}

static void Java_WXBridge_reset_clazz(JNIEnv *env, const char *className) {
  LOGE("Java_WXBridge_reset_clazz class Name is %s", className);
  g_WXBridge_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
      base::android::GetClass(env, className).Get()));
  g_WXBridge_callNative = 0;
  g_WXBridge_reportJSException = 0;
  g_WXBridge_callNativeModule = 0;
  g_WXBridge_callNativeComponent = 0;
  g_WXBridge_setTimeoutNative = 0;
  g_WXBridge_setJSFrmVersion = 0;
  g_WXBridge_callUpdateFinish = 0;
  g_WXBridge_callRefreshFinish = 0;
  g_WXBridge_reportServerCrash = 0;
  g_WXBridge_callCreateBody = 0;
  g_WXBridge_callAddElement = 0;
  g_WXBridge_callRemoveElement = 0;
  g_WXBridge_callMoveElement = 0;
  g_WXBridge_callAddEvent = 0;
  g_WXBridge_callRemoveEvent = 0;
  g_WXBridge_callUpdateStyle = 0;
  g_WXBridge_callUpdateAttrs = 0;
  g_WXBridge_callLayout = 0;
  g_WXBridge_callCreateFinish = 0;
  g_WXBridge_callRenderSuccess = 0;
  g_WXBridge_callAppendTreeCreateFinish = 0;
  g_WXBridge_callHasTransitionPros = 0;
  g_WXBridge_getMeasurementFunc = 0;
  g_WXBridge_reportNativeInitStatus = 0;
  g_WXBridge_onNativePerformanceDataUpdate = 0;
}

#endif  // com_taobao_weex_bridge_WXBridge_JNI
