diff options
-rw-r--r-- | android_webview/native/android_stream_reader_url_request_job.cc | 4 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator.py | 40 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 62 | ||||
-rw-r--r-- | media/base/android/media_player_bridge.cc | 128 | ||||
-rw-r--r-- | media/base/android/media_player_bridge.h | 6 | ||||
-rw-r--r-- | media/media.gyp | 13 |
6 files changed, 128 insertions, 125 deletions
diff --git a/android_webview/native/android_stream_reader_url_request_job.cc b/android_webview/native/android_stream_reader_url_request_job.cc index b288da6..ee545df 100644 --- a/android_webview/native/android_stream_reader_url_request_job.cc +++ b/android_webview/native/android_stream_reader_url_request_job.cc @@ -28,7 +28,7 @@ using base::android::ScopedJavaGlobalRef; using base::android::ScopedJavaLocalRef; using JNI_InputStream::Java_InputStream_available; using JNI_InputStream::Java_InputStream_skip; -using JNI_InputStream::Java_InputStream_read; +using JNI_InputStream::Java_InputStream_readI_AB_I_I; namespace { @@ -149,7 +149,7 @@ bool AndroidStreamReaderURLRequestJob::ReadRawData(net::IOBuffer* dest, int read_size = std::min(dest_size, kBufferSize); // TODO(skyostil): Make this non-blocking int32_t byte_count = - Java_InputStream_read(env, stream_.obj(), buffer, 0, read_size); + Java_InputStream_readI_AB_I_I(env, stream_.obj(), buffer, 0, read_size); if (byte_count <= 0) { // net::URLRequestJob will call NotifyDone for us after the end of the // file is reached. diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index 164778ac..de3532f 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py @@ -214,6 +214,9 @@ def JavaParamToJni(param): param = param[:param.index('<')] if param in pod_param_map: return prefix + pod_param_map[param] + if '/' in param: + # Coming from javap, use the fully qualified param directly. + return 'L' + param + ';' for qualified_name in object_param_list + app_param_list: if (qualified_name.endswith('/' + param) or qualified_name.endswith('$' + param.replace('.', '$')) or @@ -332,22 +335,38 @@ def GetEnvCall(is_constructor, is_static, return_type): return 'Call' + call + 'Method' -def GetMangledMethodName(name, jni_signature): - """Returns a mangled method name for a (name, jni_signature) pair. +def GetMangledParam(datatype): + """Returns a mangled identifier for the datatype.""" + if len(datatype) <= 2: + return datatype.replace('[', 'A') + ret = '' + for i in range(1, len(datatype)): + c = datatype[i] + if c == '[': + ret += 'A' + elif c.isupper() or datatype[i - 1] in ['/', 'L']: + ret += c.upper() + return ret + + +def GetMangledMethodName(name, params, return_type): + """Returns a mangled method name for the given signature. The returned name can be used as a C identifier and will be unique for all valid overloads of the same method. Args: name: string. - jni_signature: string. + params: list of Param. + return_type: string. Returns: A mangled name. """ - sig_translation = string.maketrans('[()/;$', 'apq_xs') - mangled_name = name + '_' + string.translate(jni_signature, sig_translation, - '"') + mangled_items = [] + for datatype in [return_type] + [x.datatype for x in params]: + mangled_items += [GetMangledParam(JavaParamToJni(datatype))] + mangled_name = name + '_'.join(mangled_items) assert re.match(r'[0-9a-zA-Z_]+', mangled_name) return mangled_name @@ -365,10 +384,9 @@ def MangleCalledByNatives(called_by_natives): method_name = called_by_native.name method_id_var_name = method_name if method_counts[java_class_name][method_name] > 1: - jni_signature = JniSignature(called_by_native.params, - called_by_native.return_type, - False) - method_id_var_name = GetMangledMethodName(method_name, jni_signature) + method_id_var_name = GetMangledMethodName(method_name, + called_by_native.params, + called_by_native.return_type) called_by_native.method_id_var_name = method_id_var_name return called_by_natives @@ -765,7 +783,7 @@ static ${RETURN} ${NAME}(JNIEnv* env, ${PARAMS_IN_DECLARATION}) { def GetCalledByNativeMethodStub(self, called_by_native): """Returns a string.""" function_signature_template = Template("""\ -static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD}(\ +static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}(\ JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""") function_header_template = Template("""\ ${FUNCTION_SIGNATURE} {""") diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index d833851..fdedc97 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py @@ -1149,14 +1149,22 @@ import org.chromium.base.BuildInfo; 'com/foo/Bar', 'no PACKAGE line') def testMethodNameMangling(self): - self.assertEquals('close_pqV', - jni_generator.GetMangledMethodName('close', '()V')) - self.assertEquals('read_paBIIqI', - jni_generator.GetMangledMethodName('read', '([BII)I')) - self.assertEquals('open_pLjava_lang_StringxqLjava_io_InputStreamx', - jni_generator.GetMangledMethodName( - 'open', - '(Ljava/lang/String;)Ljava/io/InputStream;')) + self.assertEquals('closeV', + jni_generator.GetMangledMethodName('close', [], 'void')) + self.assertEquals('readI_AB_I_I', + jni_generator.GetMangledMethodName('read', + [Param(name='p1', + datatype='byte[]'), + Param(name='p2', + datatype='int'), + Param(name='p3', + datatype='int'),], + 'int')) + self.assertEquals('openJIIS_JLS', + jni_generator.GetMangledMethodName('open', + [Param(name='p1', + datatype='java/lang/String'),], + 'java/io/InputStream')) def testFromJavaP(self): contents = """ @@ -1265,47 +1273,49 @@ static jboolean Java_InputStream_markSupported(JNIEnv* env, jobject obj) { return ret; } -static jmethodID g_InputStream_read_pqI = 0; -static jint Java_InputStream_read(JNIEnv* env, jobject obj) __attribute__ +static jmethodID g_InputStream_readI = 0; +static jint Java_InputStream_readI(JNIEnv* env, jobject obj) __attribute__ ((unused)); -static jint Java_InputStream_read(JNIEnv* env, jobject obj) { +static jint Java_InputStream_readI(JNIEnv* env, jobject obj) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_read_pqI); + DCHECK(g_InputStream_readI); jint ret = env->CallIntMethod(obj, - g_InputStream_read_pqI); + g_InputStream_readI); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_read_paBqI = 0; -static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) +static jmethodID g_InputStream_readI_AB = 0; +static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) __attribute__ ((unused)); -static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0) { +static jint Java_InputStream_readI_AB(JNIEnv* env, jobject obj, jbyteArray p0) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_read_paBqI); + DCHECK(g_InputStream_readI_AB); jint ret = env->CallIntMethod(obj, - g_InputStream_read_paBqI, p0); + g_InputStream_readI_AB, p0); base::android::CheckException(env); return ret; } -static jmethodID g_InputStream_read_paBIIqI = 0; -static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0, +static jmethodID g_InputStream_readI_AB_I_I = 0; +static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray + p0, jint p1, jint p2) __attribute__ ((unused)); -static jint Java_InputStream_read(JNIEnv* env, jobject obj, jbyteArray p0, +static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, jobject obj, jbyteArray + p0, jint p1, jint p2) { /* Must call RegisterNativesImpl() */ DCHECK(g_InputStream_clazz); - DCHECK(g_InputStream_read_paBIIqI); + DCHECK(g_InputStream_readI_AB_I_I); jint ret = env->CallIntMethod(obj, - g_InputStream_read_paBIIqI, p0, p1, p2); + g_InputStream_readI_AB_I_I, p0, p1, p2); base::android::CheckException(env); return ret; } @@ -1391,7 +1401,7 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "Z"); - g_InputStream_read_pqI = + g_InputStream_readI = base::android::GetMethodID( env, g_InputStream_clazz, "read", @@ -1400,7 +1410,7 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "I"); - g_InputStream_read_paBqI = + g_InputStream_readI_AB = base::android::GetMethodID( env, g_InputStream_clazz, "read", @@ -1410,7 +1420,7 @@ static void GetMethodIDsImpl(JNIEnv* env) { ")" "I"); - g_InputStream_read_paBIIqI = + g_InputStream_readI_AB_I_I = base::android::GetMethodID( env, g_InputStream_clazz, "read", diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc index aa6de11..7d5aa08 100644 --- a/media/base/android/media_player_bridge.cc +++ b/media/base/android/media_player_bridge.cc @@ -11,6 +11,7 @@ #include "base/stringprintf.h" #include "base/message_loop_proxy.h" #include "jni/MediaPlayerBridge_jni.h" +#include "jni/MediaPlayer_jni.h" #include "media/base/android/cookie_getter.h" #include "media/base/android/media_player_bridge_manager.h" @@ -90,15 +91,7 @@ void MediaPlayerBridge::InitializePlayer() { JNIEnv* env = AttachCurrentThread(); CHECK(env); - j_media_player_class_.Reset(GetClass(env, "android/media/MediaPlayer")); - - jmethodID constructor = GetMethodID(env, - j_media_player_class_, - "<init>", - "()V"); - ScopedJavaLocalRef<jobject> tmp( - env, env->NewObject(j_media_player_class_.obj(), constructor)); - j_media_player_.Reset(tmp); + j_media_player_.Reset(JNI_MediaPlayer::Java_MediaPlayer_Constructor(env)); jobject j_context = base::android::GetApplicationContext(); DCHECK(j_context); @@ -113,12 +106,8 @@ void MediaPlayerBridge::SetVideoSurface(jobject surface) { JNIEnv* env = AttachCurrentThread(); CHECK(env); - jmethodID method = GetMethodID(env, - j_media_player_class_, - "setSurface", - "(Landroid/view/Surface;)V"); - env->CallVoidMethod(j_media_player_.obj(), method, surface); - CheckException(env); + JNI_MediaPlayer::Java_MediaPlayer_setSurface( + env, j_media_player_.obj(), surface); } void MediaPlayerBridge::Prepare() { @@ -153,7 +142,8 @@ void MediaPlayerBridge::GetCookiesCallback(const std::string& cookies) { j_cookies.obj(), hide_url_log_)) { if (manager_) manager_->RequestMediaResources(this); - CallVoidMethod("prepareAsync"); + JNI_MediaPlayer::Java_MediaPlayer_prepareAsync( + env, j_media_player_.obj()); } else { media_error_cb_.Run(player_id_, MEDIA_ERROR_UNKNOWN); } @@ -189,25 +179,25 @@ bool MediaPlayerBridge::IsPlaying() { JNIEnv* env = AttachCurrentThread(); CHECK(env); - - jmethodID method = GetMethodID(env, j_media_player_class_, "isPlaying", - "()Z"); - jboolean result = env->CallBooleanMethod(j_media_player_.obj(), method); - CheckException(env); - + jboolean result = JNI_MediaPlayer::Java_MediaPlayer_isPlaying( + env, j_media_player_.obj()); return result; } int MediaPlayerBridge::GetVideoWidth() { if (!prepared_) return width_; - return CallIntMethod("getVideoWidth"); + JNIEnv* env = AttachCurrentThread(); + return JNI_MediaPlayer::Java_MediaPlayer_getVideoWidth( + env, j_media_player_.obj()); } int MediaPlayerBridge::GetVideoHeight() { if (!prepared_) return height_; - return CallIntMethod("getVideoHeight"); + JNIEnv* env = AttachCurrentThread(); + return JNI_MediaPlayer::Java_MediaPlayer_getVideoHeight( + env, j_media_player_.obj()); } void MediaPlayerBridge::SeekTo(base::TimeDelta time) { @@ -223,13 +213,19 @@ void MediaPlayerBridge::SeekTo(base::TimeDelta time) { base::TimeDelta MediaPlayerBridge::GetCurrentTime() { if (!prepared_) return pending_seek_; - return base::TimeDelta::FromMilliseconds(CallIntMethod("getCurrentPosition")); + JNIEnv* env = AttachCurrentThread(); + return base::TimeDelta::FromMilliseconds( + JNI_MediaPlayer::Java_MediaPlayer_getCurrentPosition( + env, j_media_player_.obj())); } base::TimeDelta MediaPlayerBridge::GetDuration() { if (!prepared_) return duration_; - return base::TimeDelta::FromMilliseconds(CallIntMethod("getDuration")); + JNIEnv* env = AttachCurrentThread(); + return base::TimeDelta::FromMilliseconds( + JNI_MediaPlayer::Java_MediaPlayer_getDuration( + env, j_media_player_.obj())); } void MediaPlayerBridge::Release() { @@ -244,7 +240,9 @@ void MediaPlayerBridge::Release() { prepared_ = false; pending_play_ = false; SetVideoSurface(NULL); - CallVoidMethod("release"); + + JNIEnv* env = AttachCurrentThread(); + JNI_MediaPlayer::Java_MediaPlayer_release(env, j_media_player_.obj()); j_media_player_.Reset(); } @@ -254,15 +252,8 @@ void MediaPlayerBridge::SetVolume(float left_volume, float right_volume) { JNIEnv* env = AttachCurrentThread(); CHECK(env); - - jmethodID method = GetMethodID(env, - j_media_player_class_, - "setVolume", - "(FF)V"); - DCHECK(method); - env->CallVoidMethod(j_media_player_.obj(), method, - left_volume, right_volume); - CheckException(env); + JNI_MediaPlayer::Java_MediaPlayer_setVolume( + env, j_media_player_.obj(), left_volume, right_volume); } void MediaPlayerBridge::DoTimeUpdate() { @@ -326,19 +317,22 @@ void MediaPlayerBridge::GetMetadata() { JNIEnv* env = AttachCurrentThread(); CHECK(env); - jmethodID method = GetMethodID(env, - j_media_player_class_, - "getMetadata", - "(ZZ)Landroid/media/Metadata;"); - ScopedJavaLocalRef<jobject> j_metadata(env, - env->CallObjectMethod(j_media_player_.obj(), - method, JNI_FALSE, JNI_FALSE)); + ScopedJavaLocalRef<jclass> media_player_class( + GetClass(env, "android/media/MediaPlayer")); + jmethodID method = GetMethodID( + env, media_player_class, "getMetadata", + "(ZZ)Landroid/media/Metadata;"); + ScopedJavaLocalRef<jobject> j_metadata( + env, env->CallObjectMethod( + j_media_player_.obj(), method, JNI_FALSE, JNI_FALSE)); CheckException(env); if (j_metadata.is_null()) return; - ScopedJavaLocalRef<jclass> cls(GetClass(env, "android/media/Metadata")); - jmethodID get_boolean = GetMethodID(env, cls, "getBoolean", "(I)Z"); + ScopedJavaLocalRef<jclass> metadata_class( + GetClass(env, "android/media/Metadata")); + jmethodID get_boolean = GetMethodID( + env, metadata_class, "getBoolean", "(I)Z"); can_pause_ = env->CallBooleanMethod(j_metadata.obj(), get_boolean, kPauseAvailable); @@ -354,7 +348,8 @@ void MediaPlayerBridge::GetMetadata() { } void MediaPlayerBridge::StartInternal() { - CallVoidMethod("start"); + JNIEnv* env = AttachCurrentThread(); + JNI_MediaPlayer::Java_MediaPlayer_start(env, j_media_player_.obj()); if (!time_update_timer_.IsRunning()) { time_update_timer_.Start( FROM_HERE, @@ -364,7 +359,8 @@ void MediaPlayerBridge::StartInternal() { } void MediaPlayerBridge::PauseInternal() { - CallVoidMethod("pause"); + JNIEnv* env = AttachCurrentThread(); + JNI_MediaPlayer::Java_MediaPlayer_pause(env, j_media_player_.obj()); time_update_timer_.Stop(); } @@ -372,46 +368,16 @@ void MediaPlayerBridge::SeekInternal(base::TimeDelta time) { JNIEnv* env = AttachCurrentThread(); CHECK(env); - jmethodID method = GetMethodID(env, j_media_player_class_, "seekTo", "(I)V"); - DCHECK(method); int time_msec = static_cast<int>(time.InMilliseconds()); - DCHECK_EQ(time.InMilliseconds(), static_cast<int64>(time_msec)); - env->CallVoidMethod(j_media_player_.obj(), - method, - time_msec); - CheckException(env); -} - -// ---- JNI Helpers for repeated call patterns. ---- - -void MediaPlayerBridge::CallVoidMethod(std::string method_name) { - JNIEnv* env = AttachCurrentThread(); - CHECK(env); - - jmethodID method = GetMethodID(env, - j_media_player_class_, - method_name.c_str(), - "()V"); - env->CallVoidMethod(j_media_player_.obj(), method); - CheckException(env); -} - -int MediaPlayerBridge::CallIntMethod(std::string method_name) { - JNIEnv* env = AttachCurrentThread(); - CHECK(env); - - jmethodID method = GetMethodID(env, - j_media_player_class_, - method_name.c_str(), - "()I"); - jint j_result = env->CallIntMethod(j_media_player_.obj(), method); - CheckException(env); - return j_result; + JNI_MediaPlayer::Java_MediaPlayer_seekTo( + env, j_media_player_.obj(), time_msec); } bool MediaPlayerBridge::RegisterMediaPlayerBridge(JNIEnv* env) { bool ret = RegisterNativesImpl(env); DCHECK(g_MediaPlayerBridge_clazz); + if (ret) + ret = JNI_MediaPlayer::RegisterNativesImpl(env); return ret; } diff --git a/media/base/android/media_player_bridge.h b/media/base/android/media_player_bridge.h index c1c1e1a..722f90f 100644 --- a/media/base/android/media_player_bridge.h +++ b/media/base/android/media_player_bridge.h @@ -142,9 +142,6 @@ class MediaPlayerBridge { bool prepared() { return prepared_; } private: - void CallVoidMethod(std::string method_name); - int CallIntMethod(std::string method_name); - // Create the actual android media player. void InitializePlayer(); @@ -207,8 +204,7 @@ class MediaPlayerBridge { // Object for retrieving cookies for this media player. scoped_ptr<CookieGetter> cookie_getter_; - // Java MediaPlayer class and instance. - base::android::ScopedJavaGlobalRef<jclass> j_media_player_class_; + // Java MediaPlayer instance. base::android::ScopedJavaGlobalRef<jobject> j_media_player_; base::RepeatingTimer<MediaPlayerBridge> time_update_timer_; diff --git a/media/media.gyp b/media/media.gyp index 9603c2d..d1a74a0 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -1162,9 +1162,22 @@ }], ['OS == "android"', { 'targets': [ + { + 'target_name': 'media_player_jni_headers', + 'type': 'none', + 'variables': { + 'jni_gen_dir': 'media', + 'input_java_class': 'android/media/MediaPlayer.class', + 'input_jar_file': '<(android_sdk)/android.jar', + }, + 'includes': [ '../build/jar_file_jni_generator.gypi' ], + }, { 'target_name': 'player_android_jni_headers', 'type': 'none', + 'dependencies': [ + 'media_player_jni_headers', + ], 'sources': [ 'base/android/java/src/org/chromium/media/MediaPlayerBridge.java', 'base/android/java/src/org/chromium/media/MediaPlayerListener.java', |