| Index: android/jni_generator/jni_generator.py
 | 
| diff --git a/android/jni_generator/jni_generator.py b/android/jni_generator/jni_generator.py
 | 
| index f7c13936f9d9c83e93ab11b96cdc39e50df30223..33f83ecc6f4fc9161cb7b16bb81358ffae54a275 100755
 | 
| --- a/android/jni_generator/jni_generator.py
 | 
| +++ b/android/jni_generator/jni_generator.py
 | 
| @@ -113,8 +113,10 @@ def JavaDataTypeToC(java_type):
 | 
|    java_type_map = {
 | 
|        'void': 'void',
 | 
|        'String': 'jstring',
 | 
| +      'Throwable': 'jthrowable',
 | 
|        'java/lang/String': 'jstring',
 | 
|        'java/lang/Class': 'jclass',
 | 
| +      'java/lang/Throwable': 'jthrowable',
 | 
|    }
 | 
|  
 | 
|    if java_type in java_pod_type_map:
 | 
| @@ -430,6 +432,8 @@ def ExtractNatives(contents, ptr_type):
 | 
|  def GetStaticCastForReturnType(return_type):
 | 
|    type_map = { 'String' : 'jstring',
 | 
|                 'java/lang/String' : 'jstring',
 | 
| +               'Throwable': 'jthrowable',
 | 
| +               'java/lang/Throwable': 'jthrowable',
 | 
|                 'boolean[]': 'jbooleanArray',
 | 
|                 'byte[]': 'jbyteArray',
 | 
|                 'char[]': 'jcharArray',
 | 
| @@ -525,7 +529,8 @@ def MangleCalledByNatives(called_by_natives):
 | 
|  
 | 
|  # Regex to match the JNI return types that should be included in a
 | 
|  # ScopedJavaLocalRef.
 | 
| -RE_SCOPED_JNI_RETURN_TYPES = re.compile('jobject|jclass|jstring|.*Array')
 | 
| +RE_SCOPED_JNI_RETURN_TYPES = re.compile(
 | 
| +    'jobject|jclass|jstring|jthrowable|.*Array')
 | 
|  
 | 
|  # Regex to match a string like "@CalledByNative public void foo(int bar)".
 | 
|  RE_CALLED_BY_NATIVE = re.compile(
 | 
| @@ -1067,12 +1072,18 @@ Java_${FULLY_QUALIFIED_CLASS}_${INIT_NATIVE_NAME}(JNIEnv* env, jclass clazz) {
 | 
|        stub_visibility = 'extern "C" __attribute__((visibility("default")))\n'
 | 
|      else:
 | 
|        stub_visibility = 'static '
 | 
| -    return_type = JavaDataTypeToC(native.return_type)
 | 
| +    return_type = return_declaration = JavaDataTypeToC(native.return_type)
 | 
| +    post_call = ''
 | 
| +    if re.match(RE_SCOPED_JNI_RETURN_TYPES, return_type):
 | 
| +      post_call = '.Release()'
 | 
| +      return_declaration = 'ScopedJavaLocalRef<' + return_type + '>'
 | 
|      values = {
 | 
|          'RETURN': return_type,
 | 
| +        'RETURN_DECLARATION': return_declaration,
 | 
|          'NAME': native.name,
 | 
|          'PARAMS': self.GetParamsInDeclaration(native),
 | 
|          'PARAMS_IN_CALL': params_in_call,
 | 
| +        'POST_CALL': post_call,
 | 
|          'STUB_NAME': self.GetStubName(native),
 | 
|          'STUB_VISIBILITY': stub_visibility,
 | 
|      }
 | 
| @@ -1081,14 +1092,10 @@ Java_${FULLY_QUALIFIED_CLASS}_${INIT_NATIVE_NAME}(JNIEnv* env, jclass clazz) {
 | 
|        optional_error_return = JavaReturnValueToC(native.return_type)
 | 
|        if optional_error_return:
 | 
|          optional_error_return = ', ' + optional_error_return
 | 
| -      post_call = ''
 | 
| -      if re.match(RE_SCOPED_JNI_RETURN_TYPES, return_type):
 | 
| -        post_call = '.Release()'
 | 
|        values.update({
 | 
|            'OPTIONAL_ERROR_RETURN': optional_error_return,
 | 
|            'PARAM0_NAME': native.params[0].name,
 | 
|            'P0_TYPE': native.p0_type,
 | 
| -          'POST_CALL': post_call,
 | 
|        })
 | 
|        template = Template("""\
 | 
|  ${STUB_VISIBILITY}${RETURN} ${STUB_NAME}(JNIEnv* env,
 | 
| @@ -1100,10 +1107,10 @@ ${STUB_VISIBILITY}${RETURN} ${STUB_NAME}(JNIEnv* env,
 | 
|  """)
 | 
|      else:
 | 
|        template = Template("""
 | 
| -static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS});
 | 
| +static ${RETURN_DECLARATION} ${NAME}(JNIEnv* env, ${PARAMS});
 | 
|  
 | 
|  ${STUB_VISIBILITY}${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS}) {
 | 
| -  return ${NAME}(${PARAMS_IN_CALL});
 | 
| +  return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
 | 
|  }
 | 
|  """)
 | 
|  
 | 
| @@ -1151,7 +1158,7 @@ ${STUB_VISIBILITY}${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS}) {
 | 
|        pre_call = ' ' + pre_call
 | 
|        return_declaration = return_type + ' ret ='
 | 
|        if re.match(RE_SCOPED_JNI_RETURN_TYPES, return_type):
 | 
| -        return_type = 'base::android::ScopedJavaLocalRef<' + return_type + '>'
 | 
| +        return_type = 'ScopedJavaLocalRef<' + return_type + '>'
 | 
|          return_clause = 'return ' + return_type + '(env, ret);'
 | 
|        else:
 | 
|          return_clause = 'return ret;'
 | 
| 
 |