本篇内容主要讲解“Java如何调用elasticsearch本地代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何调用elasticsearch本地代码”吧!
一、为什么要进行本地调用
1。基于性能的考虑
Java语言从其运行速度上来说,在大多数方面是慢于底层操作系统上原生的C和c++等语言的。这主要是由于Java虚拟机这个中间层次的存在。如果完全用Java语言实现的性能无法达到程序的预期要求,可以选择把部分重要且耗时的代码用C或c++来实现。
2。基于某些特殊的需求
Java平台提供的标准类库的功能很强大,包括了在开发中可能遇到的大部分功能。但是仍然有一些功能无法用标准API来实现,主要是一些与底层硬件平台直接交互的功能. Java虚拟机没有把这一部分功能暴露给运行在其上的程序。如果需要这方面的功能,那么只能使用原生代码来进行开发。
3。与已有的使用原生代码编写的程序之间进行集成。
如果Java程序需要与底层操作系统上由C和c++语言开发的程序进行交互,那么可以进行本地调用。
我们平时的开发更多的情况是后边两种情况,在elasticsearch中基本上是属于第二种情况。
二、使用JNI实现本地调用
针对以上提到的各种情况,Java提供了JNI (Java Native Interface)和JNA (Java本机访问)两种方式,其中JNI的一个重要使用场景是提高程序的性能。当对程序中关键部分的性能要求比较高的时候,可以使用C和c++代码来实现。
我们先来看下怎么使用JNI来进行本地调用。
首先我们需要有一个Java类来声明本地方法,并负责加载本地代码库。本地方法与Java接口中的方法或抽象类中的抽象方法一样,只包含方法声明,没有相关的实现。程序中的其他部分可以用正常的方法调用本地方法,比如参数传递和返回值使用等都与正常的方法相同。当虚拟机在执行本地方法时,会尝试在已经加载的本地代码库中查找本地方法的对应实现。在查找到对应的实现方法之后,虚拟机会负责进行参数传递,实际方法调用和返回值传递等工作。
public class HelloNative { 静态{,,, ,,,,,,,System.loadLibrary (“greetLib"); ,,,} ,,,public static native , void 问候(); }
下一步要编写实现本地方法的C/c++代码. Java提供的命令行工具根据Java源代码生成C/c++代码所需的头文件。对于本地方法,头文件中会包含相关的方法声明与其对应。
F: \ \ JNI \ src>来源;javac -h \ HelloNative \,。java
通过下边自动生成的头文件,我们可以看到这里有很多的隐式约定,我们只要按照这个声明进行实现即可,具体的规则不是今天的重点,不进行详述。
/*, DO NOT EDIT 却;能够FILE 作用;it is machine generated */# include & lt; jni.h>/*,Header for  class HelloNative */# ifndef _Included_HelloNative # define _Included_HelloNative # ifdef __cplusplus extern “C", { # endif/* ,*类:,,,,HelloNative *大敌;方法:,,,问候 ,*签名:V () ,*/JNIEXPORT void  JNICALL Java_HelloNative_greeting (才能JNIEnv *, jclass); # ifdef __cplusplus } # endif # endif
三,elasticsearch使用JNA实现本地调用
通过上边对JNI的简单了解,我们更多的时候碰到的情况是,在编写Java程序之前,就已经有了可以使用的本地代码库。这个本地代码库可能是程序的一部分,也可能是底层操作系统自带的。这些本地代码库的特点是在实现的时候并没有考虑与Java虚拟机的集成,因此也没有使用与JNI相关的内容。在使用这样的本地代码库时,我们就需要一个中间的本地代码库作为桥梁。这个本地代码库作为Java程序中本地方法的实现,负责实际调用时的参数类型转换和返回值传递等工作。这个过程是十分的繁琐的,Java提供了JNA来支持这种情况。
我们知道elasticsearch启动的时候需要检测当前用户是否是根用户,这个检测是直接调用的底层操作系统的代码,我们来看下elasticsearch是怎样使用JNA实现的。
首先elasticsearch提供了当地人类,作为调用本地方法的入口,并负责检测JNA的可用性。
, static { ,,,,,,,boolean v =,假; ,,,,,,,try { ,,,,,,,,,,,//,load one of 从而main JNA classes 用阅读if 从而classes 断开连接,只可用却;能够does not ensure that all 本地 ,,,,,,,,,,,//,libraries 断开连接,,,only 从而ones necessary by JNA 用函数 ,,,,,,,,,,,forname (“com.sun.jna.Native"); ,,,,,,,,,,,v =,真的; ,,,,,,,},catch (ClassNotFoundException e), { ,,,,,,,,,,,logger.warn (“JNA  not 发现只native methods will be 干净自己的残疾,,e); ,,,,,,,},catch (UnsatisfiedLinkError e), { ,,,,,,,,,,,logger.warn (“unable 用load JNA native support 图书馆,native methods will be 干净自己的残疾,,e); ,,,,,,,} ,,,,,,,JNA_AVAILABLE =, v; ,,,}Java如何调用elasticsearch本地代码