Bug 794982 - Autogenerate libxul JNI stubs and fail build if they change. r=glandium
authorKartikaya Gupta <kgupta@mozilla.com>
Thu, 07 Feb 2013 09:37:06 -0500
changeset 121162 8373b1ce47f029484144d386f2e2b91654a4d5db
parent 121161 5044d9a352ef5cb7e3bbcffaaf133e53116f0da3
child 121163 d91803d018734e2aeadf32878bc2b38d35edd5ef
push id24276
push userryanvm@gmail.com
push dateThu, 07 Feb 2013 21:40:43 +0000
treeherdermozilla-central@eb8f60c782da [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersglandium
bugs794982
milestone21.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 794982 - Autogenerate libxul JNI stubs and fail build if they change. r=glandium
configure.in
mobile/android/base/Makefile.in
mobile/android/base/jni-generator.py
mozglue/android/APKOpen.cpp
mozglue/android/jni-stubs.inc
--- a/configure.in
+++ b/configure.in
@@ -5808,22 +5808,23 @@ if test -n "${JAVA_BIN_PATH}"; then
   JAVA_PATH="$JAVA_BIN_PATH"
 else
   dnl No path specified, so look for javac and jar in $JAVA_HOME & $PATH.
   JAVA_PATH="$JAVA_HOME/bin:$PATH"
 fi
 
 MOZ_PATH_PROG(JAVA, java, :, [$JAVA_PATH])
 MOZ_PATH_PROG(JAVAC, javac, :, [$JAVA_PATH])
+MOZ_PATH_PROG(JAVAH, javah, :, [$JAVA_PATH])
 MOZ_PATH_PROG(JAR, jar, :, [$JAVA_PATH])
 
 if test -n "${JAVA_BIN_PATH}" -o \
   \( "$OS_TARGET" = Android -a x"$MOZ_WIDGET_TOOLKIT" != x"gonk" \); then
-  if test -z "$JAVA" -o "$JAVA" = ":" -o -z "$JAVAC" -o "$JAVAC" = ":" -o -z "$JAR" -o "$JAR" = ":"; then
-    AC_MSG_ERROR([The programs java, javac and jar were not found.  Set \$JAVA_HOME to your java sdk directory or use --with-java-bin-path={java-bin-dir}])
+  if test -z "$JAVA" -o "$JAVA" = ":" -o -z "$JAVAC" -o "$JAVAC" = ":" -o -z "$JAVAH" -o "$JAVAH" = ":" -o -z "$JAR" -o "$JAR" = ":"; then
+    AC_MSG_ERROR([The programs java, javac, javah and jar were not found.  Set \$JAVA_HOME to your java sdk directory or use --with-java-bin-path={java-bin-dir}])
   fi
 fi
 
 dnl ========================================================
 dnl = ANGLE OpenGL->D3D translator for WebGL
 dnl = * only applies to win32
 dnl = * enabled by default (shipping build); requires explicit --disable to disable
 dnl ========================================================
@@ -8450,16 +8451,17 @@ AC_SUBST(MOZ_TOOLKIT_SEARCH)
 AC_SUBST(MOZ_FEEDS)
 AC_SUBST(NS_PRINTING)
 AC_SUBST(MOZ_WEBGL)
 AC_SUBST(MOZ_HELP_VIEWER)
 AC_SUBST(TOOLCHAIN_PREFIX)
 
 AC_SUBST(JAVA)
 AC_SUBST(JAVAC)
+AC_SUBST(JAVAH)
 AC_SUBST(JAR)
 
 AC_SUBST(MOZ_PROFILELOCKING)
 
 AC_SUBST(ENABLE_TESTS)
 AC_SUBST(ENABLE_MARIONETTE)
 AC_SUBST(IBMBIDI)
 AC_SUBST(MOZ_UNIVERSALCHARDET)
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -1222,16 +1222,20 @@ jars/sync-thirdparty.jar: $(addprefix $(
 	$(NSINSTALL) -D classes/sync-thirdparty
 	$(JAVAC) $(JAVAC_FLAGS) -d classes/sync-thirdparty $(addprefix $(srcdir)/,$(SYNC_THIRDPARTY_JAVA_FILES))
 	$(JAR) cMf jars/sync-thirdparty.jar -C classes/sync-thirdparty .
 
 jars:
 	@echo "MKDIR jars"
 	$(NSINSTALL) -D jars
 
+jni-stubs.inc: jars/gecko-browser.jar jars/gecko-mozglue.jar jars/gecko-util.jar jars/sync-thirdparty.jar
+	$(JAVAH) -o javah.out -bootclasspath $(JAVA_BOOTCLASSPATH) -classpath $(subst $(NULL) $(NULL),:,$^) org.mozilla.gecko.GeckoAppShell
+	$(PYTHON) $(topsrcdir)/mobile/android/base/jni-generator.py javah.out $@
+
 PP_RES_XML= \
   $(SYNC_PP_RES_XML) \
   $(FENNEC_PP_XML_FILES) \
   $(NULL)
 
 # This is kinda awful; if any of the source files change, we remake them all.
 $(PP_RES_XML): $(patsubst res/%,$(srcdir)/resources/%.in,$(PP_RES_XML))
 	$(PYTHON) $(topsrcdir)/config/Preprocessor.py \
@@ -1331,11 +1335,13 @@ res/values/defaults.xml: $(topsrcdir)/$(
 
 
 R.java: $(MOZ_APP_ICON) $(RESOURCES) $(RES_DRAWABLE) $(RES_BRANDING_DRAWABLE_MDPI) $(RES_BRANDING_DRAWABLE_HDPI) $(RES_BRANDING_DRAWABLE_XHDPI) $(PP_RES_XML) res/values/defaults.xml res/drawable/icon.png res/drawable-hdpi/icon.png res/drawable-xhdpi/icon.png res/drawable-xxhdpi/icon.png res/values/strings.xml AndroidManifest.xml FORCE
 	$(AAPT) package -f -M AndroidManifest.xml -I $(ANDROID_SDK)/android.jar -S res -J . --custom-package org.mozilla.gecko
 
 gecko.ap_: AndroidManifest.xml res/drawable/icon.png res/drawable-hdpi/icon.png res/drawable-xhdpi/icon.png res/drawable-xxhdpi/icon.png $(RESOURCES) $(RES_DRAWABLE) $(RES_BRANDING_DRAWABLE_MDPI) $(RES_BRANDING_DRAWABLE_HDPI) $(RES_BRANDING_DRAWABLE_XHDPI) $(PP_RES_XML) res/values/defaults.xml res/values/strings.xml FORCE
 	$(AAPT) package -f -M AndroidManifest.xml -I $(ANDROID_SDK)/android.jar  -S res -F $@
 
-libs:: classes.dex package-name.txt
+libs:: classes.dex package-name.txt jni-stubs.inc
 	$(INSTALL) classes.dex $(FINAL_TARGET)
 	$(INSTALL) package-name.txt $(FINAL_TARGET)
+	@(diff jni-stubs.inc $(topsrcdir)/mozglue/android/jni-stubs.inc >/dev/null) || \
+	 (echo "*** Error: The jni-stubs have changed. Copy $(CURDIR)/jni-stubs.inc to $(topsrcdir)/mozglue/android" && exit 1)
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/jni-generator.py
@@ -0,0 +1,90 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import argparse
+import re
+
+STUB_TEMPLATE = '''
+typedef %(returnType)s (*%(functionName)s_t)(%(paramTypes)s);
+static %(functionName)s_t f_%(functionName)s;
+extern "C" NS_EXPORT %(returnType)s JNICALL
+%(functionName)s(%(parameterList)s) {
+    %(returnKeyword)s f_%(functionName)s(%(arguments)s);
+}
+'''
+BINDING_TEMPLATE = '  xul_dlsym("%(functionName)s", &f_%(functionName)s);\n'
+
+
+class Generator:
+    """
+    Class to convert a javah-produced JNI stub file into stubs/bindings files
+    for inclusion into mozglue.
+    """
+    def __init__(self, outputfile):
+        self.outputfile = outputfile
+
+    def write(self, guard, stuff):
+        self.outputfile.write('#ifdef %s\n' % guard)
+        self.outputfile.write(stuff)
+        self.outputfile.write('#endif\n\n')
+
+    def process(self, inputfile):
+        self.outputfile.write('/* WARNING - This file is autogenerated by '
+                              + 'mobile/android/base/jni-generator.py. '
+                              + 'Do not edit manually! */\n')
+
+        # this matches lines such as:
+        # JNIEXPORT void JNICALL Java_org_mozilla_gecko_GeckoAppShell_onResume
+        # and extracts the return type and the function name
+        nameRegex = re.compile('''JNIEXPORT \s+
+                                  (?P<returnType>\S+) \s+
+                                  JNICALL \s+
+                                  (?P<functionName>\S+)''', re.VERBOSE)
+
+        # this matches lines such as:
+        #   (JNIEnv *, jclass);
+        # and extracts everything within the parens; this will be split
+        # on commas to get the argument types.
+        paramsRegex = re.compile('\((.*)\);')
+
+        for line in inputfile:
+            line = line.strip()
+
+            match = re.match(nameRegex, line)
+            if match:
+                returnType = match.group('returnType')
+                functionName = match.group('functionName')
+
+            match = re.match(paramsRegex, line)
+            if match:
+                paramTypes = re.split('\s*,\s*', match.group(1))
+                paramNames = ['arg%d' % i for i in range(0, len(paramTypes))]
+
+                self.write('JNI_STUBS', STUB_TEMPLATE % {
+                    'returnType': returnType,
+                    'functionName': functionName,
+                    'paramTypes': ', '.join(paramTypes),
+                    'parameterList': ', '.join('%s %s' % param
+                                     for param in zip(paramTypes, paramNames)),
+                    'arguments': ', '.join(paramNames),
+                    'returnKeyword': 'return' if returnType != 'void' else ''})
+                self.write('JNI_BINDINGS', BINDING_TEMPLATE % {
+                    'functionName': functionName})
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description='Generate mozglue bindings for JNI functions.')
+    parser.add_argument('inputfile', type=argparse.FileType('r'))
+    parser.add_argument('outputfile', type=argparse.FileType('w'))
+    args = parser.parse_args()
+    gen = Generator(args.outputfile)
+    try:
+        gen.process(args.inputfile)
+    finally:
+        args.outputfile.close()
+        args.inputfile.close()
+
+if __name__ == '__main__':
+    main()
--- a/mozglue/android/APKOpen.cpp
+++ b/mozglue/android/APKOpen.cpp
@@ -94,232 +94,19 @@ JNI_Throw(JNIEnv* jenv, const char* clas
     int rc = jenv->ThrowNew(cls, msg);
     if (rc < 0) {
         __android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Error throwing exception %s\n", msg);
         exit(FAILURE);
     }
     jenv->DeleteLocalRef(cls);
 }
 
-#define SHELL_WRAPPER0(name) \
-typedef void (*name ## _t)(JNIEnv *, jclass); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc) \
-{ \
-  f_ ## name(jenv, jc); \
-}
-
-#define SHELL_WRAPPER0_WITH_RETURN(name, return_type) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc) \
-{ \
-  return f_ ## name(jenv, jc); \
-}
-
-#define SHELL_WRAPPER1(name,type1) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one) \
-{ \
-  f_ ## name(jenv, jc, one); \
-}
-
-#define SHELL_WRAPPER1_WITH_RETURN(name, return_type, type1) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one) \
-{ \
-  return f_ ## name(jenv, jc, one); \
-}
-
-#define SHELL_WRAPPER2(name,type1,type2) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two) \
-{ \
-  f_ ## name(jenv, jc, one, two); \
-}
-
-#define SHELL_WRAPPER2_WITH_RETURN(name, return_type, type1, type2) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two) \
-{ \
-  return f_ ## name(jenv, jc, one, two); \
-}
-
-#define SHELL_WRAPPER3(name,type1,type2,type3) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three) \
-{ \
-  f_ ## name(jenv, jc, one, two, three); \
-}
-
-#define SHELL_WRAPPER3_WITH_RETURN(name, return_type, type1, type2, type3) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three); \
-}
-
-#define SHELL_WRAPPER4(name,type1,type2,type3,type4) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four); \
-}
-
-#define SHELL_WRAPPER4_WITH_RETURN(name, return_type, type1, type2, type3, type4) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four); \
-}
-
-#define SHELL_WRAPPER5(name,type1,type2,type3,type4,type5) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four, five); \
-}
-
-#define SHELL_WRAPPER5_WITH_RETURN(name, return_type, type1, type2, type3, type4, type5) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four, five); \
-}
-
-#define SHELL_WRAPPER6(name,type1,type2,type3,type4,type5,type6) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four, five, six); \
-}
-
-#define SHELL_WRAPPER6_WITH_RETURN(name, return_type, type1, type2, type3, type4, type5, type6) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four, five, six); \
-}
-
-#define SHELL_WRAPPER7(name,type1,type2,type3,type4,type5,type6,type7) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four, five, six, seven); \
-}
-
-#define SHELL_WRAPPER7_WITH_RETURN(name, return_type, type1, type2, type3, type4, type5, type6, type7) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four, five, six, seven); \
-}
-
-#define SHELL_WRAPPER8(name,type1,type2,type3,type4,type5,type6,type7,type8) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four, five, six, seven, eight); \
-}
-
-#define SHELL_WRAPPER8_WITH_RETURN(name, return_type, type1, type2, type3, type4, type5, type6, type7, type8) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four, five, six, seven, eight); \
-}
-
-#define SHELL_WRAPPER9_WITH_RETURN(name, return_type, type1, type2, type3, type4, type5, type6, type7, type8, type9) \
-typedef return_type (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight, type9 nine); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT return_type JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight, type9 nine) \
-{ \
-  return f_ ## name(jenv, jc, one, two, three, four, five, six, seven, eight, nine); \
-}
-
-#define SHELL_WRAPPER9(name,type1,type2,type3,type4,type5,type6,type7,type8, type9) \
-typedef void (*name ## _t)(JNIEnv *, jclass, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight, type9 nine); \
-static name ## _t f_ ## name; \
-extern "C" NS_EXPORT void JNICALL \
-Java_org_mozilla_gecko_GeckoAppShell_ ## name(JNIEnv *jenv, jclass jc, type1 one, type2 two, type3 three, type4 four, type5 five, type6 six, type7 seven, type8 eight, type9 nine) \
-{ \
-  f_ ## name(jenv, jc, one, two, three, four, five, six, seven, eight, nine); \
-}
-
-SHELL_WRAPPER0(nativeInit)
-SHELL_WRAPPER1(notifyGeckoOfEvent, jobject)
-SHELL_WRAPPER0(processNextNativeEvent)
-SHELL_WRAPPER1(setSurfaceView, jobject)
-SHELL_WRAPPER2(setLayerClient, jobject, jint)
-SHELL_WRAPPER0(onResume)
-SHELL_WRAPPER0(onLowMemory)
-SHELL_WRAPPER3(callObserver, jstring, jstring, jstring)
-SHELL_WRAPPER1(removeObserver, jstring)
-SHELL_WRAPPER1(onChangeNetworkLinkStatus, jstring)
-SHELL_WRAPPER1(reportJavaCrash, jstring)
-SHELL_WRAPPER1(cameraCallbackBridge, jbyteArray)
-SHELL_WRAPPER3(notifyBatteryChange, jdouble, jboolean, jdouble)
-SHELL_WRAPPER3(notifySmsReceived, jstring, jstring, jlong)
-SHELL_WRAPPER0(bindWidgetTexture)
-SHELL_WRAPPER0(scheduleComposite)
-SHELL_WRAPPER0(schedulePauseComposition)
-SHELL_WRAPPER2(scheduleResumeComposition, jint, jint)
-SHELL_WRAPPER0_WITH_RETURN(computeRenderIntegrity, jfloat)
-SHELL_WRAPPER3_WITH_RETURN(saveMessageInSentbox, jint, jstring, jstring, jlong)
-SHELL_WRAPPER5(notifySmsSent, jint, jstring, jstring, jlong, jint)
-SHELL_WRAPPER5(notifySmsDelivery, jint, jint, jstring, jstring, jlong)
-SHELL_WRAPPER2(notifySmsSendFailed, jint, jint)
-SHELL_WRAPPER7(notifyGetSms, jint, jint, jstring, jstring, jstring, jlong, jint)
-SHELL_WRAPPER2(notifyGetSmsFailed, jint, jint)
-SHELL_WRAPPER2(notifySmsDeleted, jboolean, jint)
-SHELL_WRAPPER2(notifySmsDeleteFailed, jint, jint)
-SHELL_WRAPPER1(notifyNoMessageInList, jint)
-SHELL_WRAPPER8(notifyListCreated, jint, jint, jint, jstring, jstring, jstring, jlong, jint)
-SHELL_WRAPPER7(notifyGotNextMessage, jint, jint, jstring, jstring, jstring, jlong, jint)
-SHELL_WRAPPER2(notifyReadingMessageListFailed, jint, jint)
-SHELL_WRAPPER2(notifyFilePickerResult, jstring, jlong)
-SHELL_WRAPPER1_WITH_RETURN(getSurfaceBits, jobject, jobject)
-SHELL_WRAPPER1(onFullScreenPluginHidden, jobject)
-SHELL_WRAPPER1_WITH_RETURN(getNextMessageFromQueue, jobject, jobject)
-SHELL_WRAPPER2(onSurfaceTextureFrameAvailable, jobject, jint)
+#define JNI_STUBS
+#include "jni-stubs.inc"
+#undef JNI_STUBS
 
 static void * xul_handle = NULL;
 static void * sqlite_handle = NULL;
 static void * nss_handle = NULL;
 static void * nspr_handle = NULL;
 static void * plc_handle = NULL;
 
 template <typename T> inline void
@@ -443,54 +230,19 @@ loadGeckoLibs(const char *apkName)
   file_ids = NULL;
 #endif
 
   if (!xul_handle) {
     __android_log_print(ANDROID_LOG_ERROR, "GeckoLibLoad", "Couldn't get a handle to libxul!");
     return FAILURE;
   }
 
-#define GETFUNC(name) xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_" #name, &f_ ## name)
-  GETFUNC(nativeInit);
-  GETFUNC(notifyGeckoOfEvent);
-  GETFUNC(processNextNativeEvent);
-  GETFUNC(setSurfaceView);
-  GETFUNC(setLayerClient);
-  GETFUNC(onResume);
-  GETFUNC(onLowMemory);
-  GETFUNC(callObserver);
-  GETFUNC(removeObserver);
-  GETFUNC(onChangeNetworkLinkStatus);
-  GETFUNC(reportJavaCrash);
-  GETFUNC(cameraCallbackBridge);
-  GETFUNC(notifyBatteryChange);
-  GETFUNC(notifySmsReceived);
-  GETFUNC(bindWidgetTexture);
-  GETFUNC(scheduleComposite);
-  GETFUNC(schedulePauseComposition);
-  GETFUNC(scheduleResumeComposition);
-  GETFUNC(computeRenderIntegrity);
-  GETFUNC(saveMessageInSentbox);
-  GETFUNC(notifySmsSent);
-  GETFUNC(notifySmsDelivery);
-  GETFUNC(notifySmsSendFailed);
-  GETFUNC(notifyGetSms);
-  GETFUNC(notifyGetSmsFailed);
-  GETFUNC(notifySmsDeleted);
-  GETFUNC(notifySmsDeleteFailed);
-  GETFUNC(notifyNoMessageInList);
-  GETFUNC(notifyListCreated);
-  GETFUNC(notifyGotNextMessage);
-  GETFUNC(notifyReadingMessageListFailed);
-  GETFUNC(notifyFilePickerResult);
-  GETFUNC(getSurfaceBits);
-  GETFUNC(onFullScreenPluginHidden);
-  GETFUNC(getNextMessageFromQueue);
-  GETFUNC(onSurfaceTextureFrameAvailable);
-#undef GETFUNC
+#define JNI_BINDINGS
+#include "jni-stubs.inc"
+#undef JNI_BINDINGS
 
   void (*XRE_StartupTimelineRecord)(int, MOZTime);
   xul_dlsym("XRE_StartupTimelineRecord", &XRE_StartupTimelineRecord);
 
   MOZTime t1 = MOZ_Now();
   struct rusage usage2;
   getrusage(RUSAGE_THREAD, &usage2);
 
new file mode 100644
--- /dev/null
+++ b/mozglue/android/jni-stubs.inc
@@ -0,0 +1,463 @@
+/* WARNING - This file is autogenerated by mobile/android/base/jni-generator.py. Do not edit manually! */
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_nativeInit_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_nativeInit_t f_Java_org_mozilla_gecko_GeckoAppShell_nativeInit;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_nativeInit(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_nativeInit(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_nativeInit", &f_Java_org_mozilla_gecko_GeckoAppShell_nativeInit);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_setLayerClient_t)(JNIEnv *, jclass, jobject);
+static Java_org_mozilla_gecko_GeckoAppShell_setLayerClient_t f_Java_org_mozilla_gecko_GeckoAppShell_setLayerClient;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_setLayerClient(JNIEnv * arg0, jclass arg1, jobject arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_setLayerClient(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_setLayerClient", &f_Java_org_mozilla_gecko_GeckoAppShell_setLayerClient);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_onResume_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_onResume_t f_Java_org_mozilla_gecko_GeckoAppShell_onResume;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_onResume(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_onResume(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_onResume", &f_Java_org_mozilla_gecko_GeckoAppShell_onResume);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_onLowMemory_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_onLowMemory_t f_Java_org_mozilla_gecko_GeckoAppShell_onLowMemory;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_onLowMemory(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_onLowMemory(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_onLowMemory", &f_Java_org_mozilla_gecko_GeckoAppShell_onLowMemory);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_callObserver_t)(JNIEnv *, jclass, jstring, jstring, jstring);
+static Java_org_mozilla_gecko_GeckoAppShell_callObserver_t f_Java_org_mozilla_gecko_GeckoAppShell_callObserver;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_callObserver(JNIEnv * arg0, jclass arg1, jstring arg2, jstring arg3, jstring arg4) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_callObserver(arg0, arg1, arg2, arg3, arg4);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_callObserver", &f_Java_org_mozilla_gecko_GeckoAppShell_callObserver);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_removeObserver_t)(JNIEnv *, jclass, jstring);
+static Java_org_mozilla_gecko_GeckoAppShell_removeObserver_t f_Java_org_mozilla_gecko_GeckoAppShell_removeObserver;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_removeObserver(JNIEnv * arg0, jclass arg1, jstring arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_removeObserver(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_removeObserver", &f_Java_org_mozilla_gecko_GeckoAppShell_removeObserver);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus_t)(JNIEnv *, jclass, jstring);
+static Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus_t f_Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus(JNIEnv * arg0, jclass arg1, jstring arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus", &f_Java_org_mozilla_gecko_GeckoAppShell_onChangeNetworkLinkStatus);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef jobject (*Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue_t)(JNIEnv *, jclass, jobject);
+static Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue_t f_Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue;
+extern "C" NS_EXPORT jobject JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue(JNIEnv * arg0, jclass arg1, jobject arg2) {
+    return f_Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue", &f_Java_org_mozilla_gecko_GeckoAppShell_getNextMessageFromQueue);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable_t)(JNIEnv *, jclass, jobject, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable_t f_Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable(JNIEnv * arg0, jclass arg1, jobject arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable", &f_Java_org_mozilla_gecko_GeckoAppShell_onSurfaceTextureFrameAvailable);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash_t)(JNIEnv *, jclass, jstring);
+static Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash_t f_Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash(JNIEnv * arg0, jclass arg1, jstring arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash", &f_Java_org_mozilla_gecko_GeckoAppShell_reportJavaCrash);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent_t f_Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent", &f_Java_org_mozilla_gecko_GeckoAppShell_processNextNativeEvent);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange_t)(JNIEnv *, jclass, jdouble, jboolean, jdouble);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange(JNIEnv * arg0, jclass arg1, jdouble arg2, jboolean arg3, jdouble arg4) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange(arg0, arg1, arg2, arg3, arg4);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyBatteryChange);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived_t)(JNIEnv *, jclass, jstring, jstring, jint, jlong);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived(JNIEnv * arg0, jclass arg1, jstring arg2, jstring arg3, jint arg4, jlong arg5) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived(arg0, arg1, arg2, arg3, arg4, arg5);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsReceived);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent_t)(JNIEnv *, jclass, jint, jstring, jstring, jlong, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent(JNIEnv * arg0, jclass arg1, jint arg2, jstring arg3, jstring arg4, jlong arg5, jint arg6) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSent);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery_t)(JNIEnv *, jclass, jint, jint, jstring, jstring, jlong);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3, jstring arg4, jstring arg5, jlong arg6) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery(arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDelivery);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed_t)(JNIEnv *, jclass, jint, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsSendFailed);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms_t)(JNIEnv *, jclass, jint, jint, jstring, jstring, jstring, jlong, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3, jstring arg4, jstring arg5, jstring arg6, jlong arg7, jint arg8) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSms);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed_t)(JNIEnv *, jclass, jint, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyGetSmsFailed);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted_t)(JNIEnv *, jclass, jboolean, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted(JNIEnv * arg0, jclass arg1, jboolean arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleted);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed_t)(JNIEnv *, jclass, jint, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed_t f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed", &f_Java_org_mozilla_gecko_GeckoAppShell_notifySmsDeleteFailed);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList_t)(JNIEnv *, jclass, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList(JNIEnv * arg0, jclass arg1, jint arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyNoMessageInList);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated_t)(JNIEnv *, jclass, jint, jint, jint, jstring, jstring, jstring, jlong, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3, jint arg4, jstring arg5, jstring arg6, jstring arg7, jlong arg8, jint arg9) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyListCreated);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage_t)(JNIEnv *, jclass, jint, jint, jstring, jstring, jstring, jlong, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3, jstring arg4, jstring arg5, jstring arg6, jlong arg7, jint arg8) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyGotNextMessage);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed_t)(JNIEnv *, jclass, jint, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyReadingMessageListFailed);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite_t f_Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite", &f_Java_org_mozilla_gecko_GeckoAppShell_scheduleComposite);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition_t f_Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition(JNIEnv * arg0, jclass arg1) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition", &f_Java_org_mozilla_gecko_GeckoAppShell_schedulePauseComposition);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition_t)(JNIEnv *, jclass, jint, jint);
+static Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition_t f_Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition(JNIEnv * arg0, jclass arg1, jint arg2, jint arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition", &f_Java_org_mozilla_gecko_GeckoAppShell_scheduleResumeComposition);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef jfloat (*Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity_t)(JNIEnv *, jclass);
+static Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity_t f_Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity;
+extern "C" NS_EXPORT jfloat JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity(JNIEnv * arg0, jclass arg1) {
+    return f_Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity(arg0, arg1);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity", &f_Java_org_mozilla_gecko_GeckoAppShell_computeRenderIntegrity);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef jobject (*Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits_t)(JNIEnv *, jclass, jobject);
+static Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits_t f_Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits;
+extern "C" NS_EXPORT jobject JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits(JNIEnv * arg0, jclass arg1, jobject arg2) {
+    return f_Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits", &f_Java_org_mozilla_gecko_GeckoAppShell_getSurfaceBits);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden_t)(JNIEnv *, jclass, jobject);
+static Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden_t f_Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden(JNIEnv * arg0, jclass arg1, jobject arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden", &f_Java_org_mozilla_gecko_GeckoAppShell_onFullScreenPluginHidden);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent_t)(JNIEnv *, jclass, jobject);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(JNIEnv * arg0, jclass arg1, jobject arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyGeckoOfEvent);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge_t)(JNIEnv *, jclass, jbyteArray);
+static Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge_t f_Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge(JNIEnv * arg0, jclass arg1, jbyteArray arg2) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge(arg0, arg1, arg2);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge", &f_Java_org_mozilla_gecko_GeckoAppShell_cameraCallbackBridge);
+#endif
+
+#ifdef JNI_STUBS
+
+typedef void (*Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult_t)(JNIEnv *, jclass, jstring, jlong);
+static Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult_t f_Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult;
+extern "C" NS_EXPORT void JNICALL
+Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult(JNIEnv * arg0, jclass arg1, jstring arg2, jlong arg3) {
+     f_Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult(arg0, arg1, arg2, arg3);
+}
+#endif
+
+#ifdef JNI_BINDINGS
+  xul_dlsym("Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult", &f_Java_org_mozilla_gecko_GeckoAppShell_notifyFilePickerResult);
+#endif
+