java - 什么是本地对象?

标签 java terminology

什么是 native 对象意味着我发现 java 具有与 native 对象交互的对等类?

最佳答案

Java程序可以使用JNI访问以 native 代码实现的功能(任何编译为机器代码的东西)。与面向对象的 native 代码接口(interface)需要一个 java 类,它使用 jni 将方法调用从 java 转发到 native 类的实例。此类是 native 类的 java 对等体。

一个例子: 我们在 c++ 中有 print_hello 类,我们需要在 java 程序中使用它,为此我们需要在 java 中定义它的对等体。

原生类

  class print_hello{
  public:
      void do_stuff(){std::cout<<"hello"<<std::endl;}
  } 

java中的peer类

  class PrintHello{
    //Address of the native instance (the native object)
    long pointer;

    //ctor. calls native method to create
    //instance of print_hello
    PrintHello(){pointer = newNative();}

    ////////////////////////////
    //This whole class is for the following method
    //which provides access to the functionality 
    //of the native class
    public void doStuff(){do_stuff(pointer);}

    //Calls a jni wrapper for print_hello.do_stuff()
    //has to pass the address of the instance.
    //the native keyword keeps the compiler from 
    //complaining about the missing method body
    private native void do_stuff(long p);

    //
    //Methods for management of native resources.
    //

    //Native instance creation/destruction
    private native long newNative();
    private native deleteNative(long p);

    //Method for manual disposal of native resources
    public void dispose(){deleteNative(pointer);pointer = 0;}
  }

JNI 代码(不完整)

所有声明为 native 的方法都需要一个本地 jni 实现。以下仅实现上面声明的 native 方法之一。

//the method name is generated by the javah tool
//and is required for jni to identify it.
void JNIEXPORT Java_PrintHello_do_stuff(JNIEnv* e,jobject i, jlong pointer){
    print_hello* printer = (print_hello*)pointer;
    printer->do_stuff();
} 

关于java - 什么是本地对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568972/

相关文章:

java - JAVA中将方法作为参数传递

java - 公共(public)子网中的 AWS Apache 和私有(private)子网中的 Tomcat

java - 从关键字获取推文

MySQL 和 SQL Server 术语

java - 什么是本地对等体?

stream - 概念 : Channel vs. 流

ip-address - 什么是 "Live IP Address"?

java - 高效的多SQL插入

css - CSS 属性名称中的 'font -' vs ' text-'

java - Springfox/Swagger : Documenting HashMap object