summaryrefslogtreecommitdiffstats
path: root/base/android
diff options
context:
space:
mode:
authordigit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 20:33:03 +0000
committerdigit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-20 20:33:03 +0000
commit1353d5a890fb0442908d61d79319bfee9e8d6c63 (patch)
tree332a97cf60fc1d2e5b65737ac245b2c6a6797d8a /base/android
parent8577a602cd59f12c2580bbc91f4eb3465df60a8f (diff)
downloadchromium_src-1353d5a890fb0442908d61d79319bfee9e8d6c63.zip
chromium_src-1353d5a890fb0442908d61d79319bfee9e8d6c63.tar.gz
chromium_src-1353d5a890fb0442908d61d79319bfee9e8d6c63.tar.bz2
jni_generator.py: Handle more Java types.
This fixes several things in the jni_generator.py script: - Properly recognize array return types. Previously, a return type like byte[][] would make the generator crash. - Add missing handling of 'char' and 'short' types. - Add missing handling of JNI array types like jintArray, jdoubleArray, etc... R=bulach@chromium.org,joth@chromium.org,pliard@chromium.org,beverloo@chromium.org,jknotten@chromium.org BUG=None Review URL: https://chromiumcodereview.appspot.com/11571080 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174225 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/android')
-rwxr-xr-xbase/android/jni_generator/jni_generator.py28
-rwxr-xr-xbase/android/jni_generator/jni_generator_tests.py333
2 files changed, 353 insertions, 8 deletions
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 18312c6..7ef41f0 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -86,6 +86,8 @@ def JavaDataTypeToC(java_type):
java_pod_type_map = {
'int': 'jint',
'byte': 'jbyte',
+ 'char': 'jchar',
+ 'short': 'jshort',
'boolean': 'jboolean',
'long': 'jlong',
'double': 'jdouble',
@@ -142,6 +144,8 @@ class JniParams(object):
pod_param_map = {
'int': 'I',
'boolean': 'Z',
+ 'char': 'C',
+ 'short': 'S',
'long': 'J',
'double': 'D',
'float': 'F',
@@ -156,12 +160,10 @@ class JniParams(object):
'Ljava/lang/String',
'Ljava/lang/Class',
]
- if param == 'byte[][]':
- return '[[B'
prefix = ''
# Array?
- if param[-2:] == '[]':
- prefix = '['
+ while param[-2:] == '[]':
+ prefix += '['
param = param[:-2]
# Generic?
if '<' in param:
@@ -276,9 +278,19 @@ def ExtractNatives(contents):
def GetStaticCastForReturnType(return_type):
- if return_type in ['String', 'java/lang/String']:
- return 'jstring'
- elif return_type.endswith('[]'):
+ type_map = { 'String' : 'jstring',
+ 'java/lang/String' : 'jstring',
+ 'boolean[]': 'jbooleanArray',
+ 'byte[]': 'jbyteArray',
+ 'char[]': 'jcharArray',
+ 'short[]': 'jshortArray',
+ 'int[]': 'jintArray',
+ 'long[]': 'jlongArray',
+ 'double[]': 'jdoubleArray' }
+ ret = type_map.get(return_type, None)
+ if ret:
+ return ret
+ if return_type.endswith('[]'):
return 'jobjectArray'
return None
@@ -368,7 +380,7 @@ RE_SCOPED_JNI_RETURN_TYPES = re.compile('jobject|jclass|jstring|.*Array')
RE_CALLED_BY_NATIVE = re.compile(
'@CalledByNative(?P<Unchecked>(Unchecked)*?)(?:\("(?P<annotation>.*)"\))?'
'\s+(?P<prefix>[\w ]*?)'
- '\s*(?P<return_type>\w+)'
+ '\s*(?P<return_type>\w+(\[\])*?)'
'\s+(?P<name>\w+)'
'\s*\((?P<params>[^\)]*)\)')
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
index 5863977..eb3563fb 100755
--- a/base/android/jni_generator/jni_generator_tests.py
+++ b/base/android/jni_generator/jni_generator_tests.py
@@ -769,6 +769,33 @@ static bool RegisterNativesImpl(JNIEnv* env) {
}
@CalledByNativeUnchecked
private void uncheckedCall(int iParam);
+
+ @CalledByNative
+ public byte[] returnByteArray();
+
+ @CalledByNative
+ public boolean[] returnBooleanArray();
+
+ @CalledByNative
+ public char[] returnCharArray();
+
+ @CalledByNative
+ public short[] returnShortArray();
+
+ @CalledByNative
+ public int[] returnIntArray();
+
+ @CalledByNative
+ public long[] returnLongArray();
+
+ @CalledByNative
+ public double[] returnDoubleArray();
+
+ @CalledByNative
+ public Object[] returnObjectArray();
+
+ @CalledByNative
+ public byte[][] returnArrayOfByteArray();
"""
jni_generator.JniParams.SetFullyQualifiedClass('org/chromium/Foo')
jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
@@ -866,6 +893,105 @@ static bool RegisterNativesImpl(JNIEnv* env) {
env_call=('Void', ''),
unchecked=True,
),
+ CalledByNative(
+ return_type='byte[]',
+ system_class=False,
+ static=False,
+ name='returnByteArray',
+ method_id_var_name='returnByteArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='boolean[]',
+ system_class=False,
+ static=False,
+ name='returnBooleanArray',
+ method_id_var_name='returnBooleanArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='char[]',
+ system_class=False,
+ static=False,
+ name='returnCharArray',
+ method_id_var_name='returnCharArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='short[]',
+ system_class=False,
+ static=False,
+ name='returnShortArray',
+ method_id_var_name='returnShortArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='int[]',
+ system_class=False,
+ static=False,
+ name='returnIntArray',
+ method_id_var_name='returnIntArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='long[]',
+ system_class=False,
+ static=False,
+ name='returnLongArray',
+ method_id_var_name='returnLongArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='double[]',
+ system_class=False,
+ static=False,
+ name='returnDoubleArray',
+ method_id_var_name='returnDoubleArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='Object[]',
+ system_class=False,
+ static=False,
+ name='returnObjectArray',
+ method_id_var_name='returnObjectArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='byte[][]',
+ system_class=False,
+ static=False,
+ name='returnArrayOfByteArray',
+ method_id_var_name='returnArrayOfByteArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
]
self.assertListEquals(golden_called_by_natives, called_by_natives)
h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
@@ -1092,6 +1218,213 @@ static void Java_TestJni_uncheckedCall(JNIEnv* env, jobject obj, jint iParam) {
}
+static base::subtle::AtomicWord g_TestJni_returnByteArray = 0;
+static ScopedJavaLocalRef<jbyteArray> Java_TestJni_returnByteArray(JNIEnv* env,
+ jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnByteArray",
+
+"("
+")"
+"[B",
+ &g_TestJni_returnByteArray);
+
+ jbyteArray ret =
+ static_cast<jbyteArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jbyteArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnBooleanArray = 0;
+static ScopedJavaLocalRef<jbooleanArray> Java_TestJni_returnBooleanArray(JNIEnv*
+ env, jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnBooleanArray",
+
+"("
+")"
+"[Z",
+ &g_TestJni_returnBooleanArray);
+
+ jbooleanArray ret =
+ static_cast<jbooleanArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jbooleanArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnCharArray = 0;
+static ScopedJavaLocalRef<jcharArray> Java_TestJni_returnCharArray(JNIEnv* env,
+ jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnCharArray",
+
+"("
+")"
+"[C",
+ &g_TestJni_returnCharArray);
+
+ jcharArray ret =
+ static_cast<jcharArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jcharArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnShortArray = 0;
+static ScopedJavaLocalRef<jshortArray> Java_TestJni_returnShortArray(JNIEnv*
+ env, jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnShortArray",
+
+"("
+")"
+"[S",
+ &g_TestJni_returnShortArray);
+
+ jshortArray ret =
+ static_cast<jshortArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jshortArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnIntArray = 0;
+static ScopedJavaLocalRef<jintArray> Java_TestJni_returnIntArray(JNIEnv* env,
+ jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnIntArray",
+
+"("
+")"
+"[I",
+ &g_TestJni_returnIntArray);
+
+ jintArray ret =
+ static_cast<jintArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jintArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnLongArray = 0;
+static ScopedJavaLocalRef<jlongArray> Java_TestJni_returnLongArray(JNIEnv* env,
+ jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnLongArray",
+
+"("
+")"
+"[J",
+ &g_TestJni_returnLongArray);
+
+ jlongArray ret =
+ static_cast<jlongArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jlongArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnDoubleArray = 0;
+static ScopedJavaLocalRef<jdoubleArray> Java_TestJni_returnDoubleArray(JNIEnv*
+ env, jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnDoubleArray",
+
+"("
+")"
+"[D",
+ &g_TestJni_returnDoubleArray);
+
+ jdoubleArray ret =
+ static_cast<jdoubleArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jdoubleArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnObjectArray = 0;
+static ScopedJavaLocalRef<jobjectArray> Java_TestJni_returnObjectArray(JNIEnv*
+ env, jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnObjectArray",
+
+"("
+")"
+"[Ljava/lang/Object;",
+ &g_TestJni_returnObjectArray);
+
+ jobjectArray ret =
+ static_cast<jobjectArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jobjectArray>(env, ret);
+}
+
+static base::subtle::AtomicWord g_TestJni_returnArrayOfByteArray = 0;
+static ScopedJavaLocalRef<jobjectArray>
+Java_TestJni_returnArrayOfByteArray(JNIEnv* env, jobject obj) {
+ /* Must call RegisterNativesImpl() */
+ DCHECK(g_TestJni_clazz);
+ jmethodID method_id =
+ base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env, g_TestJni_clazz,
+ "returnArrayOfByteArray",
+
+"("
+")"
+"[[B",
+ &g_TestJni_returnArrayOfByteArray);
+
+ jobjectArray ret =
+ static_cast<jobjectArray>(env->CallObjectMethod(obj,
+ method_id));
+ base::android::CheckException(env);
+ return ScopedJavaLocalRef<jobjectArray>(env, ret);
+}
+
// Step 3: RegisterNatives.
static bool RegisterNativesImpl(JNIEnv* env) {