JNI和静态接口

时间:2011-05-11 17:57:48

标签: java c++ android java-native-interface

如果将方法定义为返回(静态)接口,那么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课程的更多信息。

2 个答案:

答案 0 :(得分:10)

嵌套/内部类不使用JNI签名中的标准命名空间命名法。实际上,内部类被Java编译器转换为与外部类相同级别的普通类,名称为“Outer $ Inner”。我想你想要"()Landroid/content/SharedPreferences$Editor;"

答案 1 :(得分:4)

无需猜测,或在论坛上询问;-) javap -s将告诉您任何Java方法的正确JNI签名字符串。