Reputation: 857
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
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
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