user3326293
user3326293

Reputation: 857

What is the naming convention for java native interface method and module name?

I am able to follow a jni tutorial just fine. But when I change the method name, I run into trouble. Is there a naming convention I need to follow? The tutorial used HelloJNI as the module name, and library name. I used "useaaacom".

Upvotes: 8

Views: 10838

Answers (2)

user207421
user207421

Reputation: 310936

You're free to call your package and class and methods whatever you like at the Java level, subject to the rules of the language, but the naming convention at the C level is completely defined by the output of the javah tool.

You can call the shared library whatever you like as well subject to filename rules and the rules of ’System.load()/loadLibrary()`.

Upvotes: 0

Michael
Michael

Reputation: 58457

From Oracle's documentation:

Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components:

  • the prefix Java_
  • a mangled fully-qualified class name
  • an underscore (_) separator
  • a mangled method name
  • for overloaded native methods, two underscores (__) followed by the mangled argument signature

So if you have the following:

package com.foo.bar;

class Baz {
    public native void Grill(int i);
}

Then the corresponding C function should be:

JNIEXPORT void JNICALL Java_com_foo_bar_Baz_Grill(JNIEnv *env, jobject thiz, jint i);

If you have an underscore in the Java method name:

public native void A_Grill(int i);

Then the C function would be:

JNIEXPORT void JNICALL Java_com_foo_bar_Baz_A_1Grill(JNIEnv *env, jobject thiz, jint i);

The _1 escape sequence matches the _ in A_Grill.

Upvotes: 45

Related Questions