2016-11-11 309 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)允許從一個實例中獲得一個類型(來自對象的類),但是反向映射是不可能的(用我猜測的任何語言)。 –