2016-11-11 39 views
1

我想知道是否有办法从jclass获得jobject?我们可以从JNIEnv调用GetObjectClass(object)获得jclass,但是我找不到从jclass获取jobject的任何地方,反之亦然。在我的实现中,我使用NewGlobalRef()函数缓存jclass实例,但是在新线程中,我需要jobject查找MethodID。我无法获得工作目标。我结束了缓存工作对象。从JNI的jclass获取jobject

回答

1

由于类和对象之间不存在1:1关系,因此不可能执行反向映射。 jclass代表一种类型,而jobject代表一个实例。

所以有可能从jobject得到jclass,因为它的意思是“识别实例的类型”。但是逆向操作是无关紧要的。可能有多个给定类型的实例,或者甚至可能没有给定类的实例。

如果您以后需要一个非静态方法,那么您必须记住对jobject的引用。

+0

对我而言,jclass应该是对jobject实例的引用。我最初从jobject实例中获得了jclass,所以我认为它应该能够将它反转回去。就像在C++中一样,如果我有一个派生自CBase的* pCBase和* pCConcrete,我可以做pCBase =(CBase *)pCConcrete和pCConcrete =(CConcrete *)pCBase。 – mdang

+0

继续我以前的评论。 (我不小心敲入了回车键)。我感到困惑的是,为了进行非静态方法调用,我需要jclass来获取方法ID,但是为了调用方法,我需要jobject作为参数之一。我不能只使用一个或另一个,因为应用程序会崩溃。现在,我需要保持jobject,并且总是调用GetObjectClass,然后必须调用DeleteLocalRef来避免填充ref表。如果你说的是JNI行为,那么我坚持这一点。 – mdang

+0

jclass不是对jobject实例的引用。 jclass是java类'Class'的一个实例。在C++中有类似jclass/Class的东西。最接近的C++机制是typeid/type_info。这不是一个JNI特定的规则。这是一个通用的面向对象机制。你需要知道一个实例(jobject)来调用一个非静态方法,并且你需要知道一个类型(jclass)来调用一个静态方法。 Java(也是JNI)允许从一个实例中获得一个类型(来自对象的类),但是反向映射是不可能的(用我猜测的任何语言)。 –