【发布时间】:2015-12-04 21:16:09
【问题描述】:
我可以很好地学习 jni 教程。但是当我更改方法名称时,我遇到了麻烦。我需要遵循命名约定吗?本教程使用 HelloJNI 作为模块名称和库名称。我用的是“useaaacom”。
【问题讨论】:
-
方法名必须与JNI函数名匹配。
标签: java android java-native-interface
我可以很好地学习 jni 教程。但是当我更改方法名称时,我遇到了麻烦。我需要遵循命名约定吗?本教程使用 HelloJNI 作为模块名称和库名称。我用的是“useaaacom”。
【问题讨论】:
标签: java android java-native-interface
动态链接器根据条目名称解析条目。本机方法名称由以下组件连接而成:
- 前缀
Java_- 错位的完全限定类名
- 下划线 (
_) 分隔符- 错位的方法名称
- 对于重载的本机方法,两个下划线 (
__) 后跟错误的参数签名
所以如果你有以下情况:
package com.foo.bar;
class Baz {
public native void Grill(int i);
}
那么对应的C函数应该是:
JNIEXPORT void JNICALL Java_com_foo_bar_Baz_Grill(JNIEnv *env, jobject thiz, jint i);
如果 Java 方法名中有下划线:
public native void A_Grill(int i);
那么 C 函数将是:
JNIEXPORT void JNICALL Java_com_foo_bar_Baz_A_1Grill(JNIEnv *env, jobject thiz, jint i);
_1 转义序列与A_Grill 中的_ 匹配。
【讨论】:
您可以在 Java 级别随意调用您的包、类和方法,但要遵守语言规则,但 C 级别的命名约定完全由 javah 的输出定义工具。
您可以根据文件名规则和 'System.load()/loadLibrary()` 规则随意调用共享库。
【讨论】: