< prev index next >
src/hotspot/share/prims/jni.cpp
Print this page
rev 56655 : 8232613: Move Object.registerNatives into HotSpot
Reviewed-by: alanb, coleenp, lfoltan
*** 2907,2999 ****
DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
, HOTSPOT_JNI_SETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
HOTSPOT_JNI_SETDOUBLEARRAYREGION_RETURN())
- //
- // Interception of natives
- //
-
- // The RegisterNatives call being attempted tried to register with a method that
- // is not native. Ask JVM TI what prefixes have been specified. Then check
- // to see if the native method is now wrapped with the prefixes. See the
- // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details.
- static Method* find_prefixed_native(Klass* k, Symbol* name, Symbol* signature, TRAPS) {
- #if INCLUDE_JVMTI
- ResourceMark rm(THREAD);
- Method* method;
- int name_len = name->utf8_length();
- char* name_str = name->as_utf8();
- int prefix_count;
- char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
- for (int i = 0; i < prefix_count; i++) {
- char* prefix = prefixes[i];
- int prefix_len = (int)strlen(prefix);
-
- // try adding this prefix to the method name and see if it matches another method name
- int trial_len = name_len + prefix_len;
- char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1);
- strcpy(trial_name_str, prefix);
- strcat(trial_name_str, name_str);
- TempNewSymbol trial_name = SymbolTable::probe(trial_name_str, trial_len);
- if (trial_name == NULL) {
- continue; // no such symbol, so this prefix wasn't used, try the next prefix
- }
- method = k->lookup_method(trial_name, signature);
- if (method == NULL) {
- continue; // signature doesn't match, try the next prefix
- }
- if (method->is_native()) {
- method->set_is_prefixed_native();
- return method; // wahoo, we found a prefixed version of the method, return it
- }
- // found as non-native, so prefix is good, add it, probably just need more prefixes
- name_len = trial_len;
- name_str = trial_name_str;
- }
- #endif // INCLUDE_JVMTI
- return NULL; // not found
- }
-
- static bool register_native(Klass* k, Symbol* name, Symbol* signature, address entry, TRAPS) {
- Method* method = k->lookup_method(name, signature);
- if (method == NULL) {
- ResourceMark rm;
- stringStream st;
- st.print("Method '");
- Method::print_external_name(&st, k, name, signature);
- st.print("' name or signature does not match");
- THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
- }
- if (!method->is_native()) {
- // trying to register to a non-native method, see if a JVM TI agent has added prefix(es)
- method = find_prefixed_native(k, name, signature, THREAD);
- if (method == NULL) {
- ResourceMark rm;
- stringStream st;
- st.print("Method '");
- Method::print_external_name(&st, k, name, signature);
- st.print("' is not declared as native");
- THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
- }
- }
-
- if (entry != NULL) {
- method->set_native_function(entry,
- Method::native_bind_event_is_interesting);
- } else {
- method->clear_native_function();
- }
- if (PrintJNIResolving) {
- ResourceMark rm(THREAD);
- tty->print_cr("[Registering JNI native method %s.%s]",
- method->method_holder()->external_name(),
- method->name()->as_C_string());
- }
- return true;
- }
-
DT_RETURN_MARK_DECL(RegisterNatives, jint
, HOTSPOT_JNI_REGISTERNATIVES_RETURN(_ret_ref));
JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
const JNINativeMethod *methods,
--- 2907,2916 ----
*** 3022,3032 ****
st.print("Method %s.%s%s not found", k->external_name(), meth_name, meth_sig);
// Must return negative value on failure
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
}
! bool res = register_native(k, name, signature,
(address) methods[index].fnPtr, THREAD);
if (!res) {
ret = -1;
break;
}
--- 2939,2949 ----
st.print("Method %s.%s%s not found", k->external_name(), meth_name, meth_sig);
// Must return negative value on failure
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), -1);
}
! bool res = Method::register_native(k, name, signature,
(address) methods[index].fnPtr, THREAD);
if (!res) {
ret = -1;
break;
}
< prev index next >