当前位置: 首页 > 面试题库 >

registerNatives()方法有什么作用?

闾丘成双
2023-03-14
问题内容

在Java中,registerNatives()Object类的私有静态方法有什么作用?


问题答案:

其他答案在技术上是正确的,但对于没有JNI经验的人来说不是很有用。:-)

通常,为了让JVM找到您的本机函数,必须以某种方式命名它们。例如,对于java.lang.Object.registerNatives,相应的C函数被命名为Java_java_lang_Object_registerNatives。通过使用registerNatives(或更确切地说,是JNI函数RegisterNatives),您可以随心所欲地命名C函数。

以下是相关的C代码(来自OpenJDK 6):

static JNINativeMethod methods[] = {
    {"hashCode",    "()I",                    (void *)&JVM_IHashCode},
    {"wait",        "(J)V",                   (void *)&JVM_MonitorWait},
    {"notify",      "()V",                    (void *)&JVM_MonitorNotify},
    {"notifyAll",   "()V",                    (void *)&JVM_MonitorNotifyAll},
    {"clone",       "()Ljava/lang/Object;",   (void *)&JVM_Clone},
};

JNIEXPORT void JNICALL
Java_java_lang_Object_registerNatives(JNIEnv *env, jclass cls)
{
    (*env)->RegisterNatives(env, cls,
                            methods, sizeof(methods)/sizeof(methods[0]));
}

(注意,Object.getClass它不在列表中;它仍将以的“标准”名称来调用Java_java_lang_Object_getClass。)对于列出的函数,相关的C函数如该表中所列,这比编写一堆转发函数更方便。

如果将Java嵌入到C程序中并希望链接到应用程序本身内的功能(而不是共享库中),或者不以其他方式“导出”正在使用的功能,则注册本机功能也很有用。通常不会通过标准方法查找机制找到。注册本机函数也可以用于将本机方法“重新绑定”到另一个C函数(例如,如果您的程序支持动态加载和卸载模块,则很有用)。

我鼓励每个人都阅读JNI书,其中讨论了更多内容。:-)



 类似资料:
  • 本文向大家介绍toArray()方法有什么作用?,包括了toArray()方法有什么作用?的使用技巧和注意事项,需要的朋友参考一下 ArrayList类的toArray()方法以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。这充当了基于数组的API和基于集合的API之间的桥梁。 示例 输出结果

  • 问题内容: 什么是 setTextFilterEnabled() 方法呢? 问题答案: 基本上,它可以过滤给定ListView的内容。然而,需要注意的,因为解释这里是过滤不会自动发生。根据该链接,您必须提供过滤逻辑,然后根据概述该方法的AbsListView文档,调用该方法的适配器还必须实现Filterable。 希望有帮助…

  • 问题内容: 我用Google搜索了很多,但是找不到。我想知道方法的用途,它有什么作用?什么时候应该使用它以及一些示例用法。 问题答案: 根据文件: random.sample(人口,k) 返回从填充序列中选择的唯一元素的ak长度列表。用于随机抽样而无需更换。 基本上,它从序列中选择k个唯一的随机元素(样本): 也可以直接从以下范围工作: 除了序列,还可以使用集合: 但是,不适用于任意迭代器:

  • 本文向大家介绍startup class的configure方法有什么作用?相关面试题,主要包含被问及startup class的configure方法有什么作用?时的应答技巧和注意事项,需要的朋友参考一下 这个方法来定义整个应用如何响应HTTP请求。它有几个比较重要的参数,application builder,Hosting environment, logo factory, 在这里我们可以

  • 问题内容: 我正在做一些测试,但是无论是否使用该方法,我都看不到任何区别。但是ExampleDepot网站上的示例使用了它。那么,这是为了什么呢?(文档对我也不清楚) 问题答案: 您可以以编程方式构建DOM树,该树具有与实际XML结构不对应的无关结构- 尤其是诸如文本类型的多个节点彼此相邻或文本类型的空节点之类的东西。该方法将删除这些文本,即,它将相邻的文本节点合并并删除空白文本节点。 当您有其他

  • yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。 结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没