diff options
author | Joonas Reynders <joonas.reynders@iki.fi> | 2012-01-22 14:17:21 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-01-22 20:31:12 +0200 |
commit | ca2dca5a98fef92437abe02fc1991e8460ddf071 (patch) | |
tree | 5bc3d6ec8bdfad3bc67ffc15d172daf3cfe34084 | |
parent | 448fa88b7e44dbf9083d782eaff129e57e066ac7 (diff) | |
download | jato-ca2dca5a98fef92437abe02fc1991e8460ddf071.tar.gz |
Refactor JNI NewObject test functions to accept args
Signed-off-by: Joonas Reynders <joonas.reynders@iki.fi>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | test/functional/java/lang/JNITest.java | 34 | ||||
-rw-r--r-- | test/functional/jni/jnitest.c | 52 |
2 files changed, 69 insertions, 17 deletions
diff --git a/test/functional/java/lang/JNITest.java b/test/functional/java/lang/JNITest.java index 389045ab..cdc89b58 100644 --- a/test/functional/java/lang/JNITest.java +++ b/test/functional/java/lang/JNITest.java @@ -95,7 +95,8 @@ public class JNITest extends TestCase { native static public boolean testJniExceptionOccurredAndExceptionClear(Throwable throwable); native static public boolean testIsSameObject(Object obj, Object sameObj, Object differentObj); native static public boolean testAllocObject(Class<?> clazz); - native static public boolean testNewObject(Class<?> clazz); + native static public Object testNewObject(Class<?> clazz, String constructorSignature, Object args); + native static public Object testNewObjectA(Class<?> clazz, String constructorSignature, Object args); native static public boolean isInstanceOf(Object obj, Class<?> clazz); private static JNITest jniTest = new JNITest(); @@ -298,34 +299,50 @@ public class JNITest extends TestCase { assertTrue(testAllocObject(Object.class)); assertThrows(new Block() { public void run() throws Throwable { - // AllocObject must throw InstantiationException for an Interface testAllocObject(Runnable.class); } }, InstantiationException.class); assertThrows(new Block() { public void run() throws Throwable { - // AllocObject must throw InstantiationException for an abstract class testAllocObject(ClassLoader.class); } }, InstantiationException.class); } public static void testNewObject() { - assertTrue(testNewObject(Object.class)); + assertEquals("test", testNewObject(String.class, "(Ljava/lang/String;)V", "test")); + assertEquals("test", testNewObject(String.class, "([C)V", "test".toCharArray())); + + assertThrows(new Block() { + public void run() throws Throwable { + testNewObject(Runnable.class, "()V", null); + } + }, InstantiationException.class); + + assertThrows(new Block() { + public void run() throws Throwable { + testNewObject(ClassLoader.class, "()V", null); + } + }, InstantiationException.class); + } + + public static void testNewObjectA() { + assertEquals("test", testNewObjectA(String.class, "(Ljava/lang/String;)V", "test")); + assertEquals("test", testNewObjectA(String.class, "([C)V", "test".toCharArray())); + assertThrows(new Block() { public void run() throws Throwable { - // NewObject must throw InstantiationException for an Interface - testNewObject(Runnable.class); + testNewObjectA(Runnable.class, "()V", null); } }, InstantiationException.class); assertThrows(new Block() { public void run() throws Throwable { - // NewObject must throw InstantiationException for an abstract class - testNewObject(ClassLoader.class); + testNewObjectA(ClassLoader.class, "()V", null); } }, InstantiationException.class); + } public static void testIsInstanceOf() { @@ -357,6 +374,7 @@ public class JNITest extends TestCase { testIsSameObject(); testAllocObject(); testNewObject(); + testNewObjectA(); testIsInstanceOf(); } } diff --git a/test/functional/jni/jnitest.c b/test/functional/jni/jnitest.c index cbdea3aa..b4b8ad82 100644 --- a/test/functional/jni/jnitest.c +++ b/test/functional/jni/jnitest.c @@ -653,21 +653,55 @@ JNIEXPORT jboolean JNICALL Java_java_lang_JNITest_testAllocObject(JNIEnv *env, j /* * Class: java_lang_JNITest * Method: testNewObject - * Signature: (Ljava/lang/Class;)Z + * Signature: ((Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; */ -JNIEXPORT jboolean JNICALL Java_java_lang_JNITest_testNewObject(JNIEnv *env, jclass clazz, jclass clazzToAlloc) +JNIEXPORT jobject JNICALL Java_java_lang_JNITest_testNewObject(JNIEnv *env, jclass clazz, jclass clazzToAlloc, jstring constructorSig, jobject args) { - jmethodID methodID = (*env)->GetMethodID(env, clazzToAlloc, "<init>", "()V"); + char *constructorSigStr; + jboolean iscopy; + + constructorSigStr = (char *) (*env)->GetStringUTFChars(env, constructorSig, &iscopy); + if (constructorSigStr == NULL) { + return NULL; /* OutOfMemoryError */ + } + jmethodID methodID = (*env)->GetMethodID(env, clazzToAlloc, "<init>", constructorSigStr); if (methodID == NULL) - return false; + return NULL; - // TODO: Add check for NewObjectV when it is implemented - if (((*env)->NewObject(env, clazzToAlloc, methodID) != NULL) && - ((*env)->NewObjectA(env, clazzToAlloc, methodID, NULL) != NULL)) - return true; + if (args != NULL) + return ((*env)->NewObject(env, clazzToAlloc, methodID, args)); else - return false; + return ((*env)->NewObject(env, clazzToAlloc, methodID, NULL)); +} + +/* + * Class: java_lang_JNITest + * Method: testNewObjectA + * Signature: ((Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_java_lang_JNITest_testNewObjectA(JNIEnv *env, jclass clazz, jclass clazzToAlloc, jstring constructorSig, jobject args) +{ + jvalue jniArgs[1]; + char *constructorSigStr; + jboolean iscopy; + + constructorSigStr = (char *) (*env)->GetStringUTFChars(env, constructorSig, &iscopy); + if (constructorSigStr == NULL) { + return NULL; /* OutOfMemoryError */ + } + + jmethodID methodID = (*env)->GetMethodID(env, clazzToAlloc, "<init>", constructorSigStr); + if (methodID == NULL) + return NULL; + + if (args != NULL) { + jniArgs[0].l = args; + return ((*env)->NewObjectA(env, clazzToAlloc, methodID, jniArgs)); + } + else { + return ((*env)->NewObjectA(env, clazzToAlloc, methodID, NULL)); + } } /* |