| Index: base/android/jni_generator/jni_generator.py
|
| diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
|
| index 007fedf77fe0138aa3cc3c5722def6bda287a76a..4290219a54ab93a85e37e39c0b213b696033dd83 100755
|
| --- a/base/android/jni_generator/jni_generator.py
|
| +++ b/base/android/jni_generator/jni_generator.py
|
| @@ -736,6 +736,7 @@ class InlHeaderFileGenerator(object):
|
|
|
| ${INCLUDES}
|
|
|
| +${PROFILING_INCLUDES}
|
| #include "base/android/jni_int_wrapper.h"
|
|
|
| // Step 1: forward declarations.
|
| @@ -770,6 +771,7 @@ $CLOSE_NAMESPACE
|
| 'CLOSE_NAMESPACE': self.GetCloseNamespaceString(),
|
| 'HEADER_GUARD': self.header_guard,
|
| 'INCLUDES': self.GetIncludesString(),
|
| + 'PROFILING_INCLUDES': self.GetProfilingIncludesString(),
|
| }
|
| assert ((values['JNI_NATIVE_METHODS'] == '') ==
|
| (values['REGISTER_NATIVES'] == ''))
|
| @@ -807,6 +809,11 @@ $CLOSE_NAMESPACE
|
| includes = self.options.includes.split(',')
|
| return '\n'.join('#include "%s"' % x for x in includes)
|
|
|
| + def GetProfilingIncludesString(self):
|
| + if not self.options.enable_profiling:
|
| + return ''
|
| + return '#include "base/compiler_specific.h"'
|
| +
|
| def GetKMethodsString(self, clazz):
|
| ret = []
|
| for native in self.natives:
|
| @@ -1001,6 +1008,9 @@ ${NATIVES}
|
| post_call = '.Release()'
|
| return_declaration = ('base::android::ScopedJavaLocalRef<' + return_type +
|
| '>')
|
| + profiling_entered_native = ''
|
| + if self.options.enable_profiling:
|
| + profiling_entered_native = 'JNI_PROFILING_ENTERED_NATIVE;'
|
| values = {
|
| 'RETURN': return_type,
|
| 'RETURN_DECLARATION': return_declaration,
|
| @@ -1010,6 +1020,7 @@ ${NATIVES}
|
| 'PARAMS_IN_CALL': params_in_call,
|
| 'POST_CALL': post_call,
|
| 'STUB_NAME': self.GetStubName(native),
|
| + 'PROFILING_ENTERED_NATIVE': profiling_entered_native,
|
| }
|
|
|
| if is_method:
|
| @@ -1025,6 +1036,7 @@ ${NATIVES}
|
| extern "C" __attribute__((visibility("default")))
|
| ${RETURN} ${STUB_NAME}(JNIEnv* env,
|
| ${PARAMS_IN_STUB}) {
|
| + ${PROFILING_ENTERED_NATIVE}
|
| ${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
|
| CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
|
| return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
|
| @@ -1036,6 +1048,7 @@ static ${RETURN_DECLARATION} ${NAME}(JNIEnv* env, ${PARAMS});
|
|
|
| extern "C" __attribute__((visibility("default")))
|
| ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
|
| + ${PROFILING_ENTERED_NATIVE}
|
| return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
|
| }
|
| """)
|
| @@ -1093,6 +1106,9 @@ ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
|
| return_clause = 'return ' + return_type + '(env, ret);'
|
| else:
|
| return_clause = 'return ret;'
|
| + profiling_leaving_native = ''
|
| + if self.options.enable_profiling:
|
| + profiling_leaving_native = 'JNI_PROFILING_LEAVING_NATIVE;'
|
| return {
|
| 'JAVA_CLASS': java_class,
|
| 'RETURN_TYPE': return_type,
|
| @@ -1108,7 +1124,8 @@ ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
|
| 'PARAMS_IN_CALL': params_in_call,
|
| 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
|
| 'CHECK_EXCEPTION': check_exception,
|
| - 'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native)
|
| + 'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native),
|
| + 'PROFILING_LEAVING_NATIVE': profiling_leaving_native,
|
| }
|
|
|
|
|
| @@ -1129,6 +1146,7 @@ ${FUNCTION_HEADER}
|
| ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
|
| jmethodID method_id =
|
| ${GET_METHOD_ID_IMPL}
|
| + ${PROFILING_LEAVING_NATIVE}
|
| ${RETURN_DECLARATION}
|
| ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
|
| method_id${PARAMS_IN_CALL})${POST_CALL};
|
| @@ -1363,6 +1381,8 @@ See SampleForTests.java for more details.
|
| option_parser.add_option('--native_exports_optional', action='store_true',
|
| help='Support both explicit and native method'
|
| 'registration.')
|
| + option_parser.add_option('--enable_profiling', action='store_true',
|
| + help='Add additional profiling instrumentation.')
|
| options, args = option_parser.parse_args(argv)
|
| if options.jar_file:
|
| input_file = ExtractJarInputFile(options.jar_file, options.input_file,
|
|
|