【问题标题】:What is the naming convention for java native interface method and module name?java本机接口方法和模块名称的命名约定是什么?
【发布时间】:2015-12-04 21:16:09
【问题描述】:

我可以很好地学习 jni 教程。但是当我更改方法名称时,我遇到了麻烦。我需要遵循命名约定吗?本教程使用 HelloJNI 作为模块名称和库名称。我用的是“useaaacom”。

【问题讨论】:

  • 方法名必须与JNI函数名匹配。

标签: java android java-native-interface


【解决方案1】:

来自Oracle's documentation

动态链接器根据条目名称解析条目。本机方法名称由以下组件连接而成:

  • 前缀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 中的_ 匹配。

【讨论】:

    【解决方案2】:

    您可以在 Java 级别随意调用您的包、类和方法,但要遵守语言规则,但 C 级别的命名约定完全由 javah 的输出定义工具。

    您可以根据文件名规则和 'System.load()/loadLibrary()` 规则随意调用共享库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-10
      • 2023-04-11
      • 1970-01-01
      • 2016-07-06
      • 2020-09-30
      • 2015-09-11
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多