summaryrefslogtreecommitdiff
path: root/libjava/jni.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/jni.cc')
-rw-r--r--libjava/jni.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/libjava/jni.cc b/libjava/jni.cc
index 0b51fce35a4..ff8f9a23fb2 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -811,7 +811,6 @@ _Jv_JNI_NewObjectA (JNIEnv *env, jclass klass, jmethodID id,
-// FIXME: local reference
template<typename T>
static T
_Jv_JNI_GetField (JNIEnv *, jobject obj, jfieldID field)
@@ -820,6 +819,14 @@ _Jv_JNI_GetField (JNIEnv *, jobject obj, jfieldID field)
return *ptr;
}
+template<>
+static jobject
+_Jv_JNI_GetField<jobject> (JNIEnv *env, jobject obj, jfieldID field)
+{
+ jobject *ptr = (jobject *) ((char *) obj + field->getOffset ());
+ return _Jv_JNI_NewLocalRef (env, *ptr);
+}
+
template<typename T>
static void
_Jv_JNI_SetField (JNIEnv *, jobject obj, jfieldID field, T value)
@@ -888,6 +895,14 @@ _Jv_JNI_GetStaticField (JNIEnv *, jclass, jfieldID field)
return *ptr;
}
+template<>
+static jobject
+_Jv_JNI_GetStaticField<jobject> (JNIEnv *env, jclass, jfieldID field)
+{
+ jobject *ptr = (jobject *) field->u.addr;
+ return _Jv_JNI_NewLocalRef (env, *ptr);
+}
+
template<typename T>
static void
_Jv_JNI_SetStaticField (JNIEnv *, jclass, jfieldID field, T value)