1
我想知道是否有办法从jclass获得jobject?我们可以从JNIEnv调用GetObjectClass(object)获得jclass,但是我找不到从jclass获取jobject的任何地方,反之亦然。在我的实现中,我使用NewGlobalRef()函数缓存jclass实例,但是在新线程中,我需要jobject查找MethodID。我无法获得工作目标。我结束了缓存工作对象。从JNI的jclass获取jobject
对我而言,jclass应该是对jobject实例的引用。我最初从jobject实例中获得了jclass,所以我认为它应该能够将它反转回去。就像在C++中一样,如果我有一个派生自CBase的* pCBase和* pCConcrete,我可以做pCBase =(CBase *)pCConcrete和pCConcrete =(CConcrete *)pCBase。 – mdang
继续我以前的评论。 (我不小心敲入了回车键)。我感到困惑的是,为了进行非静态方法调用,我需要jclass来获取方法ID,但是为了调用方法,我需要jobject作为参数之一。我不能只使用一个或另一个,因为应用程序会崩溃。现在,我需要保持jobject,并且总是调用GetObjectClass,然后必须调用DeleteLocalRef来避免填充ref表。如果你说的是JNI行为,那么我坚持这一点。 – mdang
jclass不是对jobject实例的引用。 jclass是java类'Class'的一个实例。在C++中有类似jclass/Class的东西。最接近的C++机制是typeid/type_info。这不是一个JNI特定的规则。这是一个通用的面向对象机制。你需要知道一个实例(jobject)来调用一个非静态方法,并且你需要知道一个类型(jclass)来调用一个静态方法。 Java(也是JNI)允许从一个实例中获得一个类型(来自对象的类),但是反向映射是不可能的(用我猜测的任何语言)。 –