假設我有一個Java中的MyClass類,有沒有辦法在JNI中檢查jobject
是MyClass[][]
?檢查一個Java對象是否是JNI中的數組類型
我最初的想法是使用env->IsInstanceOf(myobj, myArrayClass)
,但撥打env->FindClass("[MyClass")
則拋出NoClassDefFoundError
。
假設我有一個Java中的MyClass類,有沒有辦法在JNI中檢查jobject
是MyClass[][]
?檢查一個Java對象是否是JNI中的數組類型
我最初的想法是使用env->IsInstanceOf(myobj, myArrayClass)
,但撥打env->FindClass("[MyClass")
則拋出NoClassDefFoundError
。
我知道這個問題是舊的,但...
要找到一類的你陣列,使用:
env->FindClass("[[Lmy/package/MyClass;")
上JNI有點生疏,但有幾樣事情:你的全類名
呼叫FindClass()
,使用「/」作爲分隔符,而不是點。所以,舉例來說,如果你的類是"my.package.MyClass"
,你會打電話env->FindClass("my/package/MyClass")
既然你有你的對象類型的二維數組,你需要調用env->GetObjectArrayElement()
兩次;一次得到一排,另一次得到一個獨特的元素。那麼你可以在該元素上調用env->IsInstanceOf()
。確保你查找正確的簽名,這些JNI調用,我已經離開了他們作爲一個練習留給讀者:)
的問題是,我不知道如果我的目標是即使一個數組,和JNI規範甚至不說,如果我嘗試調用GetObjectArrayElement的對象上會發生什麼這不是一個數組。我當然不能依靠C++來告訴我,我不能將jobject轉換爲jobjectArray。 – 2010-03-30 07:33:09
您可以調用GetObjectClass()來獲取對象的類。在你上面的例子中,它會返回「[LMyClass;」 如果該類包含在一個包中,該名稱將完全限定爲「/」而不是點(即「[Lmy/package/MyClass;」) – 2010-03-30 08:11:28
確實,但我不想獲得該類,然後獲取名稱,然後比較每次調用中的字符串。我想我的情況最好的解決方案是在第一個JNI調用中創建一個數組並緩存它的類,以便我可以對其執行IsInstanceOf。 – 2010-03-31 08:10:11
其實這也是不正確的,它最後還需要';'(如Rob的評論)。 – 2013-05-14 13:16:42
@DanBerindei:是的,錯過了,糾正了 – 2013-05-14 16:50:03