java - JNI 和静态接口(interface)

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

如果方法被定义为返回(静态)接口(interface),JNI 的“方法签名”是否不同?

在我的 Java 类中我有这个方法:

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

SharedPreferences.Editor 是 SharedPreferences 中的一个静态接口(interface)。

在我的 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: method not found: Lcom/mangotaster/madballs/MyRenderer;.getSharedPrefsEditor:()Landroid/content/SharedPreferences/Editor;

我以几乎相同的方式调用该类中的其他方法,没有任何问题。

唯一的变化似乎是返回值。 我确实尝试直接从 JNI 代码调用 edit() 函数,但得到了同样的错误——这让我相信我的函数签名“()Landroid/content/SharedPreferences/Editor;”确实是错误的。

有关 SharedPreferences 的更多信息类。

最佳答案

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

关于java - JNI 和静态接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5968511/

相关文章:

java - 我的程序不会通过 HttpPost

c++ - 在 C++ 中找到 3 个数字中最小的

c++ - STL 显示输出

android - 不同智能手机上的视频观看行为(怯场不同)

android - Vimeo 无法在 Android 中播放

java - 为什么 String.getBytes() 在编译后的 jar 中表现不同?

java - 如何使用 Spring Data Mongo DB 对类进行建模来存储具有不同长度字段和类型的嵌套 JSON 文档

java - 目录中存储的文件返回空?

c++ - Boost FileSystem v3 追加 char 数组失败

android - 为什么不可用语音列表总是空的?