aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonas Reynders <joonas.reynders@iki.fi>2012-01-22 14:17:21 +0200
committerPekka Enberg <penberg@kernel.org>2012-01-22 20:31:12 +0200
commitca2dca5a98fef92437abe02fc1991e8460ddf071 (patch)
tree5bc3d6ec8bdfad3bc67ffc15d172daf3cfe34084
parent448fa88b7e44dbf9083d782eaff129e57e066ac7 (diff)
downloadjato-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.java34
-rw-r--r--test/functional/jni/jnitest.c52
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));
+ }
}
/*