2012-03-11 21 views
2

我想從這樣的本機實現另一種方法中調用的私有方法:JNI:獲得方法ID爲私有方法在超

jclass cls = (*env)->GetObjectClass(env, obj); 
jmethodID output_mid = (*env)->GetMethodID(env, cls, "methodName", "(Ljava/lang/String;)V"); 
if (output_mid == 0) 
{ 
    // Exit 
} 

這是給我一個「方法找不到」異常。從我所收集的內容來看,類對象必須對應於定義目標方法的類,因爲它是私有的。

事實上,如果我將訪問修飾符更改爲受保護,故障消失。同樣從日誌中,我看到GetObjectClass返回了運行時類,而不是基類。所以,我的問題是:如何在JNI中獲得正確的基類?

+0

當您的本機代碼返回到Java後,您應該會收到一個異常。你能發佈異常嗎? – Java42 2012-03-11 19:42:28

+0

不是一句一句,因爲我不得不重新引入這個我懶惰做的bug,但我認爲它是MethodNotFoundException的一個實例,說'methodName'不存在。謝謝。 – 2012-03-11 20:30:00

+0

@PanayiotisKarabassis出於好奇,從私人到保護的單一變化解決您的問題? – jogabonito 2012-03-12 06:01:39

回答

3

在這種情況下,您可以使用JNI函數getSuperClass()來獲取正確的類。在知道某個私有方法在的某些超類中定義的一般情況下,您可能需要遍歷繼承樹,將每個超類檢查到根。

+0

啊,謝謝,我懷疑,將修改器更改爲受保護更容易。 :-) – 2012-03-11 20:30:39

+1

來自Java文檔。 「JNI不執行類,字段和方法訪問控制限制,這些限制可以通過使用修飾符(如private和final)在Java編程語言級別表達。」我沒有看到如何添加保護或使用getSuperClass()將解決這個問題。 – Java42 2012-03-11 20:45:27

+0

我同意@ChuckFricano,改變能見度應該沒有幫助。但是,如果它確實起作用,我可以不說:-) – jogabonito 2012-03-12 06:01:20