diff options
-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) { |