简体   繁体   中英

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".

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 .

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()`.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM