Got it working. Using GetClass and toString helped me see that I was passing the wrong kind of object as a parameter across the JNI boundary. -Pete
Pete Brunet wrote: > p.s. I tried the various JNI -XX switches listed here, at least the ones > that made sense to try in my situation: > http://www.md.pp.ru/~eu/jdk6options.html > > Pete Brunet wrote: > >> I'm looking for guidance in how to debug the following jvm assert >> failure. I've tried both -Xcheck:jni and -verbose:jni but neither of >> those added any information at the point of failure. Thanks, Pete >> >> # Internal Error >> (c:\OpenJDK-b96m\jdk7\hotspot\src\share\vm\interpreter\linkResolver.cpp:71), >> pid=5216, tid=7228 >> # assert(resolved_method->signature() == selected_method->signature()) >> failed: signatures must correspond >> >> The stack looks like this: >> >> V [jvm.dll+0x3a8894] >> V [jvm.dll+0x128195] >> V [jvm.dll+0x29b5fd] >> V [jvm.dll+0x29e42e] >> V [jvm.dll+0x29f795] >> V [jvm.dll+0x29f8f8] >> V [jvm.dll+0x1a2e50] >> j >> java.awt.Component$1.getAccessibleContext(Ljava/awt/Component;)Ljavax/accessibility/AccessibleContext;+16 >> v ~StubRoutines::call_stub >> ... >> >> The calling code in awt_Component.cpp looks like this: >> >> In AwtComponent::InitIDs: >> >> jclass awtAccessorCls = env->FindClass("sun/awt/AWTAccessor"); >> jclass componentAccessorCls = >> env->FindClass("sun/awt/AWTAccessor$ComponentAccessor"); >> DASSERT(awtAccessorCls); >> DASSERT(componentAccessorCls); >> ... >> AwtComponent::getComponentAccessorMID = >> env->GetStaticMethodID(awtAccessorCls, "getComponentAccessor", >> "()Lsun/awt/AWTAccessor$ComponentAccessor;"); >> AwtComponent::getAccessibleContextMID = >> env->GetMethodID(componentAccessorCls, "getAccessibleContext", >> "(Ljava/awt/Component;)Ljavax/accessibility/AccessibleContext;"); >> DASSERT(AwtComponnet::getComponentAccessorMID); >> DASSERT(AwtComponent::getAccessibleContextMID); >> ... >> >> jobject AwtComponent::GetAccessibleContext(HWND hwnd) { >> JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); >> jclass awtAccessorCls = env->FindClass("sun/awt/AWTAccessor"); >> jobject ca = env->CallStaticObjectMethod(awtAccessorCls, >> AwtComponent::getComponentAccessorMID); >> DASSERT(!safe_ExceptionOccurred(env)); >> AwtComponent* c = GetComponentImpl(hwnd); >> jobject self = c->GetPeer(env); // self is the java side of the >> peer code, i.e. the Component >> jobject ac = env->CallObjectMethod(ca, >> AwtComponent::getAccessibleContextMID, self); >> ... >> >> The called method, getAccessibleContext, in java.awt.Component looks >> like this: >> >> static { >> AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() { >> ... >> public AccessibleContext getAccessibleContext(Component comp) { >> return comp.accessibleContext; >> } >> }); >> } >> >> Thanks, Pete >> >>
