2011-05-11 99 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