native_nativexml - CSDN
native 订阅
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。 展开全文
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
信息
外文名
native
类    型
计算机术语
中文名
原生方法
软    件
Java
nativeNative Method(原生方法)
"A native method is a Java method whose implementation is provided by non-java code." [1]  在定义一个native method时,并不提供实现体(有些像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。下面给了一个示例:这些方法的声明描述了一些非Java代码在这些Java代码里看起来像什么样子(view).标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这些非基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被final标识,它被继承后不能被重写。本地方法非常有用,因为它有效地扩充了JVM。事实上,我们所写的Java代码已经用到了本地方法,在Sun的Java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越Java运行时的界限。有了本地方法,Java程序可以做任何应用层次的任务。
收起全文
精华内容
参与话题
  • 全面了解Java中Native关键字的作用

    万次阅读 多人点赞 2018-08-09 10:42:25
    初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个native呢?这是我所要学习的地方。所以下面想要总结下native。 一、认识 native 即 JNI,Java ...

    初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法:

    1	public native int hashCode(); 

    为什么有个native呢?这是我所要学习的地方。所以下面想要总结下native。

    一、认识 native 即 JNI,Java Native Interface

    凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。

    image

    二、用 Java 调用 C 的“Hello,JNI”

    我们需要按照下班方便的步骤进行:

    1、创建一个Java类,里面包含着一个 native 的方法和加载库的方法 loadLibrary。HelloNative.java 代码如下:

    public class HelloNative
    
    {
    
      static
    
      {
    
        System.loadLibrary("HelloNative");
    
      }
    
        
      public static native void sayHello();
       
    
      @SuppressWarnings("static-access")
    
      public static void main(String[] args)
    
      {
    
        new HelloNative().sayHello();
    
      }
    
    }

    首先让大家注意的是native方法,那个加载库的到后面也起作用。native 关键字告诉编译器(其实是JVM)调用的是该方法在外部定义,这里指的是C。如果大家直接运行这个代码, JVM会告之:“A Java Exception has occurred.”控制台输出如下:

     

    1

    2

    3

    4

    5

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

      at java.lang.ClassLoader.loadLibrary(Unknown Source)

      at java.lang.Runtime.loadLibrary0(Unknown Source)

      at java.lang.System.loadLibrary(Unknown Source)

      at HelloNative.<clinit>(HelloNative.java:5)

    这是程序使用它的时候,虚拟机说不知道如何找到sayHello。下面既可以手动写,自然泥瓦匠是用

    2、运行javah,得到包含该方法的C声明头文件.h

    将HelloNative.java ,简单地 javac javah,如图

    image

    就得到了下面的 HelloNative.h文件 

    /* DO NOT EDIT THIS FILE - it is machine generated */
    
    #include <jni.h>
    
    /* Header for class HelloNative */
    
      
    
    #ifndef _Included_HelloNative
    
    #define _Included_HelloNative
    
    #ifdef __cplusplus
    
    extern "C" {
    
    #endif
    
    /*
    
     * Class:   HelloNative
    
     * Method:  sayHello
    
     * Signature: ()V
    
     */
    
    JNIEXPORT void JNICALL Java_HelloNative_sayHello
    
     (JNIEnv *, jclass);
    
      
    
    #ifdef __cplusplus
    
    }
    
    #endif
    
    #endif

    jni.h 这个文件,在/%JAVA_HOME%include

    3、根据头文件,写C实现本地方法。

    这里我们简单地实现这个sayHello方法如下:

    #include "HelloNative.h"
    
    #include <stdio.h>
    
      
    JNIEXPORT void JNICALL Java_HelloNative_sayHello
    
    {
    
      printf("Hello,JNI"); 
    
    }

    4、生成dll共享库,然后Java程序load库,调用即可。

    在Windows上,MinGW GCC 运行如下

    1

    gcc -m64 -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.7.0_71\include" -I"C:\Program Files\Java\jdk1.7.0_71\include\include\win32" -shared -o HelloNative.dll HelloNative.c

    -m64表示生成dll库是64位的。然后运行 HelloNative:

    1

    java HelloNative

    终于成功地可以看到控制台打印如下:

    1

    Hello,JNI

    三、JNI 调用 C 流程图

    四、其他介绍

    native是与C++联合开发的时候用的!java自己开发不用的!


    使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。
    这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。

    1。native 是用做java 和其他语言(如c++)进行协作时用的也就是native 后的函数的实现不是用java写的

    2。既然都不是java,那就别管它的源代码了,呵呵

    native的意思就是通知操作系统,
    这个函数你必须给我实现,因为我要使用。
    所以native关键字的函数都是操作系统实现的,java只能调用。

    java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就要一些其他语言的帮助,这个就是native的作用了

    Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。
      可以将native方法比作Java程序同C程序的接口,其实现步骤:
      

    1、在Java中声明native()方法,然后编译; 

    2、用javah产生一个.h文件; 

    3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件); 

    4、将第三步的.cpp文件编译成动态链接库文件; 

    5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

    JAVA本地方法适用的情况

    1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问

    2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的

    3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

    展开全文
  • Java中native关键字

    万次阅读 多人点赞 2013-05-20 11:44:09
    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记。 native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是...

    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记。

    native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

    JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

    不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。但是,如果必须执行本地调用,则要考虑几个准则:

    1.将您的所有本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标操作系统平台,都可以用特定于适当平台的版本的DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

    2.本地方法尽量简单。尽量使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减少到最小。使您的本地方法尽量独立,以将加载您的DLL和应用程序所需的开销减少到最小。如果需要运行时DLL,必须随应用程序一起提供。

    JNI的书写步骤如下:

    a.编写带有native声明的方法的Java类

    b.使用javac命令编译编写的Java类

    c.使用java -jni ****来生成后缀名为.h的头文件

    d.使用其他语言(C、C++)实现本地方法

    e.将本地方法编写的文件生成动态链接库

    以下是一个在Java中调用本地C程序的简单的例子:

    a.编写HelloWorld.java类

    class HelloWorld{

    public native void hello();

    static{
    System.loadLibrary("hello");
    }

    public static void main(String[] args){

    new HelloWorld().hello();
    }

    }

    b.编译

    javac HelloWorld.java

    c.生成.h文件

    javah -jni HelloWorld

    生成内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */

    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class: HelloWorld
    * Method: hello
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_HelloWorld_hello
    (JNIEnv *, jobject);

    #ifdef __cplusplus
    }
    #endif
    #endif

    第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数

    d.c实现

    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>
    JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
    printf("Hello World!\n");
    return;
    }

    其中,第一行是将jni.h文件引入(在%JAVA_HOME%\include目录下),里边有JNIEnv和jobject的定义。

    e.编译c实现

    这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。

    cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll

    注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

    6) 运行程序

    java HelloWorld就ok了!

    例子是照着别人的网页做的,其他还有很多东西,可以看资源连接。

    资源:

    IBM网站的一篇文章:http://www.ibm.com/developerworks/cn/java/jnimthds/

    china itpub一篇文章:http://java.chinaitlab.com/JDK/36677.html

     http://java.chinaitlab.com/JDK/36678.html

    J2SE5的Java Native Interface Specification

     http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html

    展开全文
  • Java的native方法

    万次阅读 多人点赞 2018-06-26 14:33:42
    第一篇:今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native ...

    第一篇:
    今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。
    一. 什么是Native Method
       简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。
       "A native method is a Java method whose implementation is provided by non-java code."
       在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。,下面给了一个示例:    
        public class IHaveNatives
        {
          native public void Native1( int x ) ;
          native static public long Native2() ;
          native synchronized private float Native3( Object o ) ;
          native void Native4( int[] ary ) throws Exception ;
        } 
        这些方法的声明描述了一些非java代码在这些java代码里看起来像什么样子(view).
        标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)
        一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。
        native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。
        如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被fianl标识,它被继承后不能被重写。
       本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。
    二.为什么要使用Native Method
       java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
       与java环境外交互:
       有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
       与操作系统交互:
       JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
        Sun's Java
        Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVM调用。
    三.JVM怎样使Native Method跑起来:
        我们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,并且只会回载一次。在这个被加载的字节码的入口维持着一个该类所有方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。
        如果一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实现在一些DLL文件内,但是它们会被操作系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,因此指向方法实现的指针并不会被设置。当本地方法被调用之前,这些DLL才会被加载,这是通过调用java.system.loadLibrary()实现的。
       
       最后需要提示的是,使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。

    展开全文
  • 【java】详解native方法的使用

    万次阅读 2018-06-08 21:07:01
    目录结构:关于native关键字使用native关键字使用步骤案例编写.java文件编译.java文件获得.h文件编写hello.cpp文件部署hello.dll文件运行HelloWorld.class文件参考文章1,关于native关键字想必读者已经了解过native...

    目录结构:

    1,关于native关键字

    想必读者已经了解过native关键字了。这里笔者就大致囊括一下,被native关键字修饰的方法叫做本地方法,本地方法和其它方法不一样,本地方法意味着和平台有关,因此使用了native的程序可移植性都不太高。另外native方法在JVM中运行时数据区也和其它方法不一样,它有专门的本地方法栈。native方法主要用于加载文件和动态链接库,由于Java语言无法访问操作系统底层信息(比如:底层硬件设备等),这时候就需要借助C语言来完成了。被native修饰的方法可以被C语言重写。

    2,使用native关键字

    2.1,使用步骤

    • Java程序中声明native修饰的方法,类似于abstract修饰的方法,只有方法签名,没有方法实现。编译该java文件,会产生一个.class文件。
    • 使用javah编译上一步产生的class文件,会产生一个.h文件。
    • 写一个.cpp文件实现上一步中.h文件中的方法。
    • 将上一步的.cpp文件编译成动态链接库文件.dll。
    • 最后就可以使用System或是Runtime中的loadLibrary()方法加载上一步的产生的动态连接库文件了。

    2.2,案例

    为了更好理解,该案例的所有都在文件在 D:\JNI\ 目录下。

    2.2.1 编写.java文件

    复制代码
    public class HelloWorld{
        public native void h();//该方法和abstract修饰的方法一样,只有签名。
        
        static{
            System.loadLibrary("hello");//不写文件的后缀,程序会自动加上.dll的。
        }
        
        public static void main(String[] args){
            new HelloWorld().h();//调用
        }
    }
    复制代码

    2.2.2 编译.java文件

    在AMD中编译该程序 javac HelloWorld.java ,就会产生一个HelloWorld.class文件。

    2.2.3 获得.h文件

    将第二步中产生的字节码文件,通过 javah -jni HelloWorld 就会产生一个HelloWorld.h文件。

    我们用记事本打开HelloWorld.h文件

    复制代码
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */
    
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    h
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_h
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    复制代码

    可以看出,在HelloWorld.java文件中的h()方法已经变成了 JNIEXPORT void JNICALL Java_HelloWorld_h (JNIEnv *, jobject); ,方法名是原来的 包名_类名_方法名 。在该文件中还引用了 jni.h 文件。

    2.2.4 编写hello.cpp文件

    编写hello.cpp文件的方式有许多,可以利用Visual Studio软件,因为最后需要生成dll文件,因此在下载Visual Studio之前应该查一查版本是否能够生成自己电脑需要的dll版本(32位dll或64为dll)。这里读者下载的是vs2013,该版本既可以生成32的dll,由可以生成64位的dll。关于vs2013生成dll可以参考Visual Studio 2013生成64位dll

    因为我们在第一步中调用的文件名称为hello,所以这里的.cpp文件必须为 hello.cpp 文件。这里笔者的文件如下:

    复制代码
    // hello.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include "HelloWorld.h"
    
    JNIEXPORT void JNICALL Java_HelloWorld_h(JNIEnv *, jobject) {
        printf("Hello! ");//打印信息
    }
    复制代码

    可以看出引入了 HelloWorld.h 文件,所以hello.cpp 文件应该和 HelloWorld.h文件在同一个目录下面。如果读者现在编译hello.cpp文件会报错 “jni.h”: No such file or directory 。在 HelloWorld.h 文件中我们引入了 jni.h文件,所以也应该把 jni.h 文件放到同一级目录下面,关于这个文件和相关的文件读者可以到JDK的安装目录下面的include下面查找,更多信息可以查看JDk、JRE、JVM的关系。还应该把 HelloWorld.h 文件中的 #include <jni.h> 改为 #include "jni.h" 。最后生成 hello.dll 文件就可以了

    2.2.5 部署hello.dll文件

    我们使用了 System.loadLibary("hello"); 加载动态链接库,这个加载路径是按照java.libary.path进行查询的,读者可以根据System.getProperty("java.libary.path")验证,该路径就是环境变量中的path路径。网上有好多说直接把hello.dll仍在 C:\Windows\System32 路径下。不过笔者建议,先应该查看自己环境变量path的值,那么把hello.dll放到path中配置的第一个路径下。

    2.2.6 运行HelloWorld.class文件

    我们回到  D:/JNI  路径下,使用  java HelloWorld  就成功调用动态连接库了。

    笔者的控制台上成功打印了hello!。笔者对这里加载的理解,就是利用反射机制,在运行的时候找到hello.dll文件并且解析,根据动态链接库中的文件名称创建出对象和方法,然后我们就可以利用对象调用方法了。上面的HelloWorld.java文件,创建动态链接库和调用方法都在同一个类中,这样的话一个只需要使用这个类的对象调用方法就可以通过编译和运行了。如果我们引入的是被人的.cpp文件,那么根据.cpp文件中的方法名,在需要的地方做适当调整就可以调用了。

    3,使用native关键字目的

    为什么要使用Native Method
       java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。
       与java环境外交互:
       有时java应用需要与java外面的环境交互。这是本地方法存在的主要原因,你可以想想java需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解java应用之外的繁琐的细节。
       与操作系统交互:
       JVM支持着java语言本身和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些连接到本地代码的库组成。然而不管怎 样,它毕竟不是一个完整的系统,它经常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统常常是强大的操作系统。通过使用本地方法,我们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,如果我们要使用一些java语言本身没有提供封装的操作系统的特性时,我们也需要使用本地方法。
        Sun's Java
        Sun的解释器是用C实现的,这使得它能像一些普通的C一样与外部交互。jre大部分是用java实现的,它也通过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,但是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库(external dynamic link library)提供,然后被JVM调用。

    总的来说,JAVA的native方法适用的情况:
      1、为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问。
      2、为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的。

      3、为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

    4,native关键字特点

        标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)
        一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这非些基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。
        native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。
        如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被fianl标识,它被继承后不能被重写。
       本地方法非常有用,因为它有效地扩充了jvm.事实上,我们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越java运行时的界限。有了本地方法,java程序可以做任何应用层次的任务。

    展开全文
  • vue 事件中的 .native

    万次阅读 2017-12-25 10:35:32
    .native是什么?.native - 监听组件根元素的原生事件。 主要是给自定义的组件添加原生事件。例子 给普通的标签加事件,然后加native是无效的<!DOCTYPE html> <title>Document <div
  • native APP,hybrid APP和web APP

    万次阅读 2018-08-29 18:57:28
    native APP,hybrid APP和web APP三者的区别 随着智能手机的普及,移动端应用几乎成为每个互联网产品的标配。在快速迭代的互联网战场中高效开发、低成本上线产品,是每个应用开发团队追求的目标。此时,选择合适的...
  • Java的native关键字

    万次阅读 多人点赞 2008-10-14 21:00:00
    今天研究Java基础类库,Object类的时候,发现了一个关键字:native咦?这是个什么东东?它认识我,我可不认识它!嘿嘿,没关系,baidu一下。 java native关键字 一. 什么是Native Method 简单地讲,一个Native ...
  • java中native的用法

    万次阅读 2016-03-02 15:12:01
    Java开发中会碰到声明为 native的方法,如:public native int hashCode(); 这是一个native方法。为什么存在native方法呢?Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接...
  • vue中'. native'修饰符的使用

    万次阅读 多人点赞 2018-06-22 11:47:27
    可以使用 v-on 的修饰符 .native 。 通俗点讲:就是在父组件中给子组件绑定一个原生的事件,就将子组件变成了普通的HTML标签,不加'. native'事件是无法触 发的。 此时点击页面中的按钮无任何反应。 ...
  • react-native-picker时间选择和城市选择

    万次阅读 热门讨论 2017-03-21 08:53:50
    react-native-picker https://github.com/beefe/react-native-picker
  • React Native常用第三方组件汇总--史上最全

    万次阅读 多人点赞 2019-05-05 10:13:43
    React Native 项目常用第三方组件汇总: react-native-animatable 动画 react-native-carousel 轮播 react-native-countdown 倒计时 react-native-device-info 设备信息 react-native-fileupload ...
  • vue @click.native

    万次阅读 2018-07-05 10:41:26
    1,给vue组件绑定事件时候,必须加上native ,不然不会生效(监听根元素的原生事件,使用 .native 修饰符)2,等同于在自组件中: 子组件内部处理click事件然后向外发送click事件:$emit("click".fn).....
  • 解决办法:Failed to load the native TensorFlow runtime.

    万次阅读 多人点赞 2020-07-23 17:54:30
    跑CPU版的object-detection的示例程序,导入tensorflow时...Failed to load the native TensorFlow runtime. 解决办法就是:pip install --upgrade --ignore-installed tensorflow 更新一下tensorflow就好了 ...
  • @click-native-prevent

    万次阅读 2018-07-25 14:38:01
    看到这个@click.native.prevent有点懵逼, 然后查了点资料,还是零零散散的资料。。自己总结一下   1.在封装好的组件上使用,所以要加上.native才能click 2.prevent就相当于..event.preventDefault()   所以...
  • 1,jar包 请使用这个jar包: ...Native.loadLibrary("NLPIR", CLibrary.class)会自动去项目的src/main/resources文件夹下寻找系统对应的dll和so。 (根据com.sun.jna.Platform类对应文件夹名) eg:
  • 如何查看java源码中的native方法源码

    万次阅读 2015-03-25 21:30:42
    (直接下载完整的OpenJDK源码包也可以,那就可以忽略上面提到的链接的前半段,只参考后半段相对路径即可。)  接下来里面就是jdk子项目(也就是OpenJDK里的大部分类库... native/ 平台无关的native代码实现(主要是C
  • react-native 实现渐变色背景

    万次阅读 2018-04-01 11:21:30
    1、需要借助插件react-native-linear-gradient插件 安装: yarn add react-native-linear-gradient react-native link react-native-linear-gradient2、导入react-native-linear-gradient 依赖BVLinearGradie...
  • React Native库版本升级与降级

    万次阅读 2017-05-10 11:10:00
    迄今为止React Native获得了超过48K的star,最新版本0.44,已经趋于稳定。(官网地址:https://github.com/facebook/react-native)。随着React Native的大热,笔者也是在最近和出版商签订了《React Native入门到...
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword'; FLUSH PRIVILEGES; 方法二: 编辑my.cnf文件,更改默认的身份认证插件。 vi /etc/my.cnf 在[mysqld]中添加下边的...
  • vue 中 @click.native.prevent 事件

    万次阅读 2019-10-02 18:59:12
    在项目中看到@click.native.prevent, 查了一点资料 总结一下, 1.给vue组件绑定事件时候,必须加上native ,否则会认为监听的是来自Item组件自定义的事件, 2.prevent 是用来阻止默认的 ,相当于原生的...
1 2 3 4 5 ... 20
收藏数 598,440
精华内容 239,376
关键字:

native