summaryrefslogtreecommitdiffstats
path: root/runtime/jni_internal_test.cc
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2014-06-26 14:45:07 +0200
committerSebastien Hertz <shertz@google.com>2014-06-26 14:45:28 +0200
commitd3333767dc25566ad207c90c897adaefd813588d (patch)
tree9c31cbcc5ebdc77dc7865953bddb973c45d03acd /runtime/jni_internal_test.cc
parent0c1734665c38b3116e38a90ad06c3f152d9316c5 (diff)
downloadart-d3333767dc25566ad207c90c897adaefd813588d.zip
art-d3333767dc25566ad207c90c897adaefd813588d.tar.gz
art-d3333767dc25566ad207c90c897adaefd813588d.tar.bz2
Fix JNI ToReflectedMethod for constructor
Returns java.lang.reflect.Constructor object for <init> and <clinit> methods. Bug: https://code.google.com/p/android/issues/detail?id=72312 Bug: 15885285 Change-Id: I2f4a266b2d9574659673dc6966104860578d709e
Diffstat (limited to 'runtime/jni_internal_test.cc')
-rw-r--r--runtime/jni_internal_test.cc30
1 files changed, 25 insertions, 5 deletions
diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc
index a933f86..d255ec8 100644
--- a/runtime/jni_internal_test.cc
+++ b/runtime/jni_internal_test.cc
@@ -380,19 +380,39 @@ TEST_F(JniInternalTest, FromReflectedField_ToReflectedField) {
TEST_F(JniInternalTest, FromReflectedMethod_ToReflectedMethod) {
jclass jlrMethod = env_->FindClass("java/lang/reflect/Method");
+ ASSERT_NE(jlrMethod, nullptr);
+ jclass jlrConstructor = env_->FindClass("java/lang/reflect/Constructor");
+ ASSERT_NE(jlrConstructor, nullptr);
jclass c = env_->FindClass("java/lang/String");
ASSERT_NE(c, nullptr);
- jmethodID mid = env_->GetMethodID(c, "length", "()I");
+
+ jmethodID mid = env_->GetMethodID(c, "<init>", "()V");
ASSERT_NE(mid, nullptr);
- // Turn the mid into a java.lang.reflect.Method...
+ // Turn the mid into a java.lang.reflect.Constructor...
jobject method = env_->ToReflectedMethod(c, mid, JNI_FALSE);
- ASSERT_NE(c, nullptr);
- ASSERT_TRUE(env_->IsInstanceOf(method, jlrMethod));
+ ASSERT_NE(method, nullptr);
+ ASSERT_TRUE(env_->IsInstanceOf(method, jlrConstructor));
// ...and back again.
jmethodID mid2 = env_->FromReflectedMethod(method);
ASSERT_NE(mid2, nullptr);
// Make sure we can actually use it.
- jstring s = env_->NewStringUTF("poop");
+ jstring s = reinterpret_cast<jstring>(env_->AllocObject(c));
+ ASSERT_NE(s, nullptr);
+ env_->CallVoidMethod(s, mid2);
+ ASSERT_EQ(JNI_FALSE, env_->ExceptionCheck());
+
+ mid = env_->GetMethodID(c, "length", "()I");
+ ASSERT_NE(mid, nullptr);
+ // Turn the mid into a java.lang.reflect.Method...
+ method = env_->ToReflectedMethod(c, mid, JNI_FALSE);
+ ASSERT_NE(method, nullptr);
+ ASSERT_TRUE(env_->IsInstanceOf(method, jlrMethod));
+ // ...and back again.
+ mid2 = env_->FromReflectedMethod(method);
+ ASSERT_NE(mid2, nullptr);
+ // Make sure we can actually use it.
+ s = env_->NewStringUTF("poop");
+ ASSERT_NE(s, nullptr);
ASSERT_EQ(4, env_->CallIntMethod(s, mid2));
// Bad arguments.