【问题标题】:Get jobject from jclass in JNI从 JNI 中的 jclass 获取作业
【发布时间】:2016-11-11 23:29:14
【问题描述】:

我想知道是否有办法从 jclass 中获取作业?我们可以从 JNIEnv 调用 GetObjectClass(object) 中获取 jclass,但我找不到任何地方可以从 jclass 中获取 jobject,反之亦然。在我的实现中,我使用 NewGlobalRef() 函数缓存了 jclass 实例,但是在新线程中我需要 jobject 来查找 MethodID。我没有办法得到这份工作。我最终改为缓存作业。

【问题讨论】:

    标签: java java-native-interface jnienv


    【解决方案1】:

    不可能进行反向映射,因为类和对象之间没有 1 : 1 的关系。 jclass 代表一个类型,而jobject 代表一个实例。

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

    如果您稍后需要调用非静态方法,则必须记住对 jobject 的引用。

    【讨论】:

    • 就我而言,jclass 应该是对作业对象实例的引用。我最初从 jobject 实例中获得了 jclass,因此,我认为它应该能够进行反向转换。就像在 C++ 中一样,如果我有一个 pCBase 和一个从 CBase 派生的 *pCConcrete,我可以执行 pCBase =(CBase)pCConcrete 和 pCConcrete = (CConcrete*)pCBase。
    • 继续我之前的评论。 (我不小心按了回车键)。令我困惑的是,要进行非静态方法调用,我需要 jclass 来获取 methodID,但是要进行方法调用,我需要将 jobject 作为参数之一。我不能只使用其中一个,因为应用程序会崩溃。现在,我需要保留作业,并且始终必须调用 GetObjectClass,然后必须调用 DeleteLocalRef 以避免 ref 表被填充。如果你说的是 JNI 行为,那么我就被困住了。
    • jclass 不是对 jobject 实例的引用。 jclass 是 java 类Class 的一个实例。 C++中有类似jclass/Class这样的东西。最接近的 C++ 机制是 typeid/type_info。这不是 JNI 特定的规则。它是一种通用的 OOP 机制。你需要知道一个实例(jobject)来调用一个非静态方法,你需要知道一个类型(jclass)来调用一个静态方法。 Java(以及 JNI)允许从实例中获取类型(从对象中获取类),但反向映射是不可能的(我猜是任何语言)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多