DO NOT MERGE Fix all unsafe caching to be like libcore.
This way, if a runtime is restarted within a process, we re-initialize all
the cached data.
Conflicts:
src/native/java_lang_Runtime.cc -- nativeExit lost an argument in dalvik-dev
(cherry picked from commit 7756d5473fa27ce7e6ac7c31770eef7030431da4)
Change-Id: I6184fc20c2a9ec16c4b053584a4d1c3b64452d0f
diff --git a/src/native/java_lang_Class.cc b/src/native/java_lang_Class.cc
index 2cd7090..66c83c7 100644
--- a/src/native/java_lang_Class.cc
+++ b/src/native/java_lang_Class.cc
@@ -14,16 +14,15 @@
* limitations under the License.
*/
-#include "jni_internal.h"
#include "class_linker.h"
#include "class_loader.h"
+#include "jni_internal.h"
#include "nth_caller_visitor.h"
#include "object.h"
#include "object_utils.h"
#include "ScopedLocalRef.h"
#include "ScopedUtfChars.h"
-
-#include "JniConstants.h" // Last to avoid problems with LOG redefinition.
+#include "well_known_classes.h"
namespace art {
@@ -62,9 +61,9 @@
if (c == NULL) {
ScopedLocalRef<jthrowable> cause(env, env->ExceptionOccurred());
env->ExceptionClear();
- static jclass ClassNotFoundException_class = CacheClass(env, "java/lang/ClassNotFoundException");
- static jmethodID ctor = env->GetMethodID(ClassNotFoundException_class, "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V");
- jthrowable cnfe = reinterpret_cast<jthrowable>(env->NewObject(ClassNotFoundException_class, ctor, javaName, cause.get()));
+ jthrowable cnfe = reinterpret_cast<jthrowable>(env->NewObject(WellKnownClasses::java_lang_ClassNotFoundException,
+ WellKnownClasses::java_lang_ClassNotFoundException_init,
+ javaName, cause.get()));
env->Throw(cnfe);
return NULL;
}
@@ -89,8 +88,8 @@
template<typename T>
static jobjectArray ToArray(JNIEnv* env, const char* array_class_name, const std::vector<T*>& objects) {
- jclass array_class = env->FindClass(array_class_name);
- jobjectArray result = env->NewObjectArray(objects.size(), array_class, NULL);
+ ScopedLocalRef<jclass> array_class(env, env->FindClass(array_class_name));
+ jobjectArray result = env->NewObjectArray(objects.size(), array_class.get(), NULL);
for (size_t i = 0; i < objects.size(); ++i) {
ScopedLocalRef<jobject> object(env, AddLocalReference<jobject>(env, objects[i]));
env->SetObjectArrayElement(result, i, object.get());
@@ -472,7 +471,7 @@
};
void register_java_lang_Class(JNIEnv* env) {
- jniRegisterNativeMethods(env, "java/lang/Class", gMethods, NELEM(gMethods));
+ REGISTER_NATIVE_METHODS("java/lang/Class");
}
} // namespace art