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 idunknown
push userunknown
push dateunknown
reviewersglandium
bugs794982
milestone21.0a1
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
+