olafure
olafure

Reputation: 3597

JNI and static interface

Is JNI's "method signature" different if method is defined to return (static) interface ?

In my Java class I have this method:

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

SharedPreferences.Editor is a static interface in SharedPreferences.

In my C++ JNI code I do this:

// '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;");

For some odd reason, this doesn't work. It compiles, but at runtime I get this:

DEBUG/dalvikvm(19020): GetMethodID: method not found: Lcom/mangotaster/madballs/MyRenderer;.getSharedPrefsEditor:()Landroid/content/SharedPreferences/Editor;

I'm calling other methods in that class in pretty much the same way without any problems.

The only change seems to be the return value. I did try to call the edit() function straight from JNI code, but got the same error - which makes me believe that my function signature "()Landroid/content/SharedPreferences/Editor;" is indeed wrong.

More info on the SharedPreferences class.

Upvotes: 1

Views: 3410

Answers (2)

user207421
user207421

Reputation: 310840

No need to guess about this, or ask on forums ;-) javap -s will tell you the correct JNI signature string for any Java method.

Upvotes: 4

Tim Sylvester
Tim Sylvester

Reputation: 23128

Nested/Inner classes don't use the standard namespace nomenclature in JNI signatures. The inner class is actually translated to a normal class at the same level as the outer class by the Java compiler with the name "Outer$Inner". I think you want "()Landroid/content/SharedPreferences$Editor;".

Upvotes: 10

Related Questions