2011-05-11 100 views
1

如果方法被定義爲返回(靜態)接口,那麼JNI的「方法簽名」是不同的?JNI和靜態接口

在我的Java類,我有這樣的方法:

public SharedPreferences.Editor getSharedPrefsEditor() { 
    return mActivity.getPreferences(Context.MODE_PRIVATE).edit(); 
} 

SharedPreferences.Editor是SharedPreferences靜態接口。

在我的C++ JNI代碼我這樣做:

// 'env' is the java environment that JNI passes to us 
// 'jObject' is the one that JNI passes to us (along with env) 
jclass javaCallerClass = env->GetObjectClass(jObject); 
jmethodID methodId_getSharedPrefsEditor = env->GetMethodID(
    javaCallerClass, 
    "getSharedPrefsEditor", 
    "()Landroid/content/SharedPreferences/Editor;"); 

對於一些奇怪的原因,這是行不通的。它編譯,但在運行時我得到這個:

DEBUG/dalvikvm(19020)的GetMethodID:找不到 方法: LCOM/mangotaster/madballs/MyRenderer; .getSharedPrefsEditor :()Landroid /內容/ SharedPreferences /編輯;

我以幾乎相同的方式調用該類中的其他方法,沒有任何問題。

唯一的變化似乎是返回值。 我曾嘗試直接從JNI代碼調用edit()函數,但得到了相同的錯誤 - 這讓我相信我的函數簽名「()Landroid/content/SharedPreferences/Editor;」確實是錯的。

有關SharedPreferences類的更多信息。

回答

9

嵌套/內部類不使用JNI簽名中的標準名稱空間術語。內部類實際上被Java編譯器翻譯爲與外部類相同級別的普通類,名稱爲「Outer $ Inner」。我想你想要"()Landroid/content/SharedPreferences$Editor;"

+0

你有多麼正確@Tim! 有趣的是,這確實讓我更早想到了,但是我沒有嘗試過,卻在腦海中將它解散了。謝謝! – olafure 2011-05-11 18:45:57

4

無需猜測此問題,或者在論壇上提問;-) javap -s會告訴您任何Java方法的正確JNI簽名字符串。

+2

優秀點!在這種情況下: 的javap -classpath /path/to/android.jar -s android.content.SharedPreferences 爲您提供: 公共抽象android.content.SharedPreferences $編輯器編輯(); 簽名:()Landroid/content/SharedPreferences $編輯器; – olafure 2011-05-12 06:59:44