diff options
author | Tom Tromey <tromey@cygnus.com> | 2000-02-18 21:22:06 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2000-02-18 21:22:06 +0000 |
commit | 8ade47715eddea64a001e982da714b791e5e6e44 (patch) | |
tree | 6637b7627b283f1bc28869d88ab6c8eecc6e22fc /libjava/jni.cc | |
parent | 31e890f0f32d3132d0519f640203060a9fc0f0a6 (diff) | |
download | gcc-8ade47715eddea64a001e982da714b791e5e6e44.zip gcc-8ade47715eddea64a001e982da714b791e5e6e44.tar.gz gcc-8ade47715eddea64a001e982da714b791e5e6e44.tar.bz2 |
jvm.h (_Jv_GetJavaVM): Declare.
* include/jvm.h (_Jv_GetJavaVM): Declare.
* include/java-interp.h (_Jv_GetFirstMethod): New function.
(_Jv_MethodBase::get_method): New method.
(_Jv_JNIMethod::set_function): New method.
* jni.cc (_Jv_JNI_UnregisterNatives): New function.
(_Jv_JNI_RegisterNatives): New function.
(_Jv_JNIFunctions): Updated for new functions.
(_Jv_GetJavaVM): New function.
(_Jv_JNI_GetJavaVM): Use it. Now static.
(_Jv_JNI_AttachCurrentThread): Create a new JNIEnv if this thread
is already a Java thread but does not have a JNIEnv yet.
* java/lang/natRuntime.cc (_load): Pass the JavaVM to the onload
function.
From-SVN: r32056
Diffstat (limited to 'libjava/jni.cc')
-rw-r--r-- | libjava/jni.cc | 99 |
1 files changed, 87 insertions, 12 deletions
diff --git a/libjava/jni.cc b/libjava/jni.cc index 51b7b19..42c0d07 100644 --- a/libjava/jni.cc +++ b/libjava/jni.cc @@ -1258,6 +1258,63 @@ _Jv_JNI_FromReflectedMethod (JNIEnv *, jobject method) _Jv_FromReflectedConstructor (reinterpret_cast<Constructor *> (method)); } +static jint +_Jv_JNI_RegisterNatives (JNIEnv *env, jclass k, + const JNINativeMethod *methods, + jint nMethods) +{ + // For now, this only matters for interpreted methods. FIXME. + if (! _Jv_IsInterpretedClass (k)) + { + // FIXME: throw exception. + return JNI_ERR; + } + _Jv_InterpClass *klass = reinterpret_cast<_Jv_InterpClass *> (k); + + // Look at each descriptor given us, and find the corresponding + // method in the class. + for (int j = 0; j < nMethods; ++j) + { + bool found = false; + + _Jv_MethodBase **imeths = _Jv_GetFirstMethod (klass); + for (int i = 0; i < JvNumMethods (klass); ++i) + { + _Jv_MethodBase *meth = imeths[i]; + _Jv_Method *self = meth->get_method (); + + if (! strcmp (self->name->data, methods[j].name) + && ! strcmp (self->signature->data, methods[j].signature)) + { + if (! (self->accflags + & java::lang::reflect::Modifier::NATIVE)) + break; + + // Found a match that is native. + _Jv_JNIMethod *jmeth = reinterpret_cast<_Jv_JNIMethod *> (meth); + jmeth->set_function (methods[i].fnPtr); + found = true; + break; + } + } + + if (! found) + { + jstring m = JvNewStringUTF (methods[j].name); + _Jv_JNI_Throw (env, new java::lang::NoSuchMethodError (m)); + return JNI_ERR; + } + } + + return JNI_OK; +} + +static jint +_Jv_JNI_UnregisterNatives (JNIEnv *, jclass) +{ + return JNI_ERR; +} + #ifdef INTERPRETER @@ -1460,7 +1517,7 @@ _Jv_JNI_AttachCurrentThread (JavaVM *, jstring name, void **penv, void *args) } // Attaching an already-attached thread is a no-op. - if (_Jv_ThreadCurrent () != NULL) + if (_Jv_GetCurrentJNIEnv () != NULL) return 0; JNIEnv *env = (JNIEnv *) _Jv_MallocUnchecked (sizeof (JNIEnv)); @@ -1480,8 +1537,13 @@ _Jv_JNI_AttachCurrentThread (JavaVM *, jstring name, void **penv, void *args) } *penv = reinterpret_cast<void *> (env); - java::lang::Thread *t = new gnu::gcj::jni::NativeThread (group, name); - t = t; // Avoid compiler warning. Eww. + // This thread might already be a Java thread -- this function might + // have been called simply to set the new JNIEnv. + if (_Jv_ThreadCurrent () == NULL) + { + java::lang::Thread *t = new gnu::gcj::jni::NativeThread (group, name); + t = t; // Avoid compiler warning. Eww. + } _Jv_SetCurrentJNIEnv (env); return 0; @@ -1655,21 +1717,34 @@ JNI_GetCreatedJavaVMs (JavaVM **vm_buffer, jsize buf_len, jsize *n_vms) return 0; } -jint -_Jv_JNI_GetJavaVM (JNIEnv *, JavaVM **vm) +JavaVM * +_Jv_GetJavaVM () { // FIXME: synchronize if (! the_vm) { JavaVM *nvm = (JavaVM *) _Jv_MallocUnchecked (sizeof (JavaVM)); - if (nvm == NULL) - return JNI_ERR; - nvm->functions = &_Jv_JNI_InvokeFunctions; + if (nvm != NULL) + nvm->functions = &_Jv_JNI_InvokeFunctions; the_vm = nvm; } - *vm = the_vm; - return 0; + // If this is a Java thread, we want to make sure it has an + // associated JNIEnv. + if (_Jv_ThreadCurrent () != NULL) + { + void *ignore; + _Jv_JNI_AttachCurrentThread (the_vm, &ignore, NULL); + } + + return the_vm; +} + +static jint +_Jv_JNI_GetJavaVM (JNIEnv *, JavaVM **vm) +{ + *vm = _Jv_GetJavaVM (); + return *vm == NULL ? JNI_ERR : JNI_OK; } @@ -1904,8 +1979,8 @@ struct JNINativeInterface _Jv_JNIFunctions = _Jv_JNI_SetPrimitiveArrayRegion, _Jv_JNI_SetPrimitiveArrayRegion, _Jv_JNI_SetPrimitiveArrayRegion, - NOT_IMPL /* RegisterNatives */, - NOT_IMPL /* UnregisterNatives */, + _Jv_JNI_RegisterNatives, + _Jv_JNI_UnregisterNatives, _Jv_JNI_MonitorEnter, _Jv_JNI_MonitorExit, _Jv_JNI_GetJavaVM, |