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

Java中的本机方法是什么,应在哪里使用?

慕容宏毅
2023-03-14
问题内容

本机方法与抽象方法具有相同的语法,但是在哪里实现呢?


问题答案:

Java中的本机方法是什么,应在哪里使用?

一旦看到一个小例子,就很清楚了:

Main.java

public class Main {
    public native int intMethod(int i);
    public static void main(String[] args) {
        System.loadLibrary("Main");
        System.out.println(new Main().intMethod(2));
    }
}

Main.c

#include <jni.h>
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) {
  return i * i;
}

编译并运行

javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
  -I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main

输出

4

在Ubuntu 14.04上使用Oracle JDK 1.8.0_45进行了测试。

因此很明显,它允许您执行以下操作:

  • 使用Java中的任意汇编代码调用经过编译的动态加载的库(此处用C编写)
  • 并将结果返回Java

这可以用来:

  • 使用更好的CPU组装指令在关键部分上编写更快的代码(非CPU可移植)
  • 进行直接系统调用(非OS便携式)

以降低便携性为代价。

也可以从C调用Java,但是必须首先在C中创建JVM:如何从C++调用Java函数?

GitHub上的示例供您使用。



 类似资料:
  • 本机方法与抽象方法具有相同的语法,但它在哪里实现?

  • 问题内容: Angularjs中angular.bind的用途是什么。请提供一个例子。无法从https://docs.angularjs.org/api/ng/function/angular.bind了解 问题答案: Angular.bind是一种实用功能,它结合了function.bind和部分功能应用程序中的功能。 绑定 (通常)是您想将当前上下文绑定到函数,但实际上在以后执行的想法。 在进

  • 让这种方法本土化背后的逻辑是什么? 与仅使用哈希图制作内嵌字符串池相比,有什么优势? 它看起来有点奇怪,但在非本机代码中似乎很容易做到: 那么为什么是本机代码呢?

  • 问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意

  • 问题内容: 我正在使用Java和Swing应用程序框架开发桌面应用程序。我有一个关于box的应用程序,我希望该box包含一些有关正在测试哪个版本的指示。我希望该值可以自动更改。我正在使用CruiseControl构建从SVN提交触发的应用程序。 他人使用什么机制来完成这项工作?是否有一个关于Box版本号的库或一组与蚂蚁相关的工具,我可以在构建过程中使用它们? 我不是在寻找部署选项,也不是在寻找自动

  • 这就是我目前拥有所有实体类的方式(此处仅显示一个以供参考) 来自lombok参考: @Data注释可能是项目Lombok工具集中最常用的注释。它结合了@ToString、@EqualsAndHashCode、@Getter和@Setter的功能。本质上,在类上使用@数据与使用默认的@ToString和@EqualsAndHashCode注释该类以及使用@Getter和@Setter注释每个字段是一