diff options
author | digit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 20:33:03 +0000 |
---|---|---|
committer | digit@chromium.org <digit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 20:33:03 +0000 |
commit | 1353d5a890fb0442908d61d79319bfee9e8d6c63 (patch) | |
tree | 332a97cf60fc1d2e5b65737ac245b2c6a6797d8a /base/android | |
parent | 8577a602cd59f12c2580bbc91f4eb3465df60a8f (diff) | |
download | chromium_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-x | base/android/jni_generator/jni_generator.py | 28 | ||||
-rwxr-xr-x | base/android/jni_generator/jni_generator_tests.py | 333 |
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) { |