📜  Java中的本机关键字

📅  最后修改于: 2022-05-13 01:55:41.746000             🧑  作者: Mango

Java中的本机关键字

Java中的 native 关键字应用于方法,表示该方法是使用 JNI(Java Native Interface)在本机代码中实现的。 native 关键字是仅适用于方法的修饰符,我们不能将其应用于其他任何地方。用 C、C++ 实现的方法称为本地方法或外来方法。

native 修饰符表示方法是在依赖于平台的代码中实现的,这在 C 语言中很常见。 Native 修饰符表示方法是在依赖于平台的代码中实现的,通常在 C 中。

原生关键字的主要目标

  • 以提高系统的性能。
  • 实现机器级/内存级通信。
  • 使用已经存在的遗留非 Java 代码。

创建原生方法的步骤如下:

  1. 编写Java代码
  2. 编译Java代码。
  3. 创建 C 头文件(.h 文件)
  4. 创建 C 存根文件(使用工具: Java HEdge)
  5. 编写C代码
  6. 创建共享代码库 (DLL)
  7. 运行应用程序

实现: Java中的 Native 关键字

让我们首先获取包含本机方法的随机Java代码,然后我们将对其进行编译。我们完成了以上两个步骤。对于第 3 步和第 4 步,我们将使用名为Java HEdge 的现有 .exe 来创建 C 头文件和 C 存根文件。

现在我们将插入(编写)我们的 C 代码(或使用),稍后使用 DLL,我们将在我们的应用程序中创建相同的对象(主要示例 1A),然后在Java程序中调用本机方法。

示例 1-A:应用程序 

Java
// Java Program to Illustrate Native Keyword
// Inside DLL named: NameOfDLLFile
 
// Main class
// NativeDemo
class GFG {
 
    // Method 1
    public static void main(String[] args)
    {
 
        int var;
 
        // Here we will not be having body of this method
        // in our java code here
        NameOfDLLFile obj = new NameOfDLLFile();
 
        obj.var = null;
 
        System.out.println("Before native method: var = "
                           + var);
 
        obj.test();
 
        System.out.println("After native method: var = "
                           + var);
    }
 
    // Native method
    public native void test()
    {
 
        static
        {
 
            // We will be loading body from DLL file
            // It has to be present in DLL file
            System.loadLibrary("NameOfDLLFile");
 
            // Above C code in loaded in the JVM
        }
    }
}


C++
// C++ Program to Be Shared In DLL to Illustrate
// Native Method in Java
 
// Importing required libraries
#include 
 
using namespace std;
 
// Method 1
// Main driver method
int main()
{
 
    test(10);
 
    return;
}
 
// Method 2
// Native
void test()
{
    int var;
    cout << var;
}


对于上述程序,在 DLL 中共享的 C 代码如下:

示例 1-B:支持上述示例

C++

// C++ Program to Be Shared In DLL to Illustrate
// Native Method in Java
 
// Importing required libraries
#include 
 
using namespace std;
 
// Method 1
// Main driver method
int main()
{
 
    test(10);
 
    return;
}
 
// Method 2
// Native
void test()
{
    int var;
    cout << var;
}

输出:

Before native method: var = null
After native method: var = 10

请记住,关于原生关键字有一些要点,如下所示:

  • 对于本机方法,已在 C、C++ 等旧语言中提供实现,我们不负责提供实现。因此,本机方法声明应以 ; 结尾(分号)。
  • 我们不能将本机方法声明为抽象的。
  • 我们不能将本地方法声明为 strictfp,因为不能保证旧语言(C、C++)遵循 IEEE 754 标准。因此,本机 strictfp 组合是方法的非法组合。
  • native 关键字的主要优点是性能提升,但 native 关键字的主要缺点是它打破了Java的平台无关性。

在本节中,我们将解释如何在Java中声明本机方法以及如何生成相应的 C/C++函数原型。

语法:声明本机方法

private native String getLine(String prompt);

语法:从母语方面

javah -jni Prompt
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);