summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android_webview/native/android_stream_reader_url_request_job.cc4
-rwxr-xr-xbase/android/jni_generator/jni_generator.py40
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py62
-rw-r--r--media/base/android/media_player_bridge.cc128
-rw-r--r--media/base/android/media_player_bridge.h6
-rw-r--r--media/media.gyp13
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',