Java中的native关键字应用于方法,以指示该方法是在使用JNI(Java native Interface)的本机代码中实现的。native关键字是一个适用的修饰符 仅适用于方法 ,我们不能在其他任何地方应用它。在C、C++中实现的方法称为本机方法或异类方法。
本机修饰符表示方法是在依赖于平台的代码中实现的,这在C语言中很常见。原生修饰符表示方法是在依赖于平台的代码中实现的,通常是在C语言中。
本机关键字的主要目标
- 以提高系统的性能。
- 实现机器级/内存级通信。
- 使用已有的遗留非java代码。
结论: java应用程序扫描调用代码是用C++、汇编语言编写的。
创建本机方法的步骤如下:
- 编写java代码
- 编译java代码。
- 创建C头(.h文件)
- 创建C存根文件(使用工具:Java HEdge)
- 编写C代码
- 创建共享代码库(DLL)
- 运行应用程序
实施: Java中的原生关键字
让我们首先随机获取包含本机方法的java代码,稍后我们将对其进行编译。我们完成了上述两个步骤。
对于步骤3和4,我们将使用现有的。exe称为java HEdge,用于创建C头文件和C存根文件。现在我们将编写我们的C代码(或使用),并在以后使用
现在圣
实例
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 } } } |
对于上述程序,DLL中共享的C代码如下:
C++
// C++ Program to Be Shared In DLL to Illustrate // Native Method in Java // Importing required libraries #include <iostream> using namespace std; // Method 1 // Main driver method int main() { test(10); return ; } // Method 2 // Native void test() { int var; cout << var; } |
注: DLL被命名为可以从程序1A中看到的: 文件名
输出:
Before native method: var = nullAfter native method: var = 10
请记住,关于原生关键字,有以下几点很重要:
- 对于本机方法,实现已经在C、C++等旧语言中可用,并且我们不负责提供实现。因此,本机方法声明应该以结束;(分号)。
- 我们不能将本机方法声明为 摘要 .
- 我们不能将本机方法声明为 严格的 因为不能保证旧语言(C,C++)遵循IEEE 754标准。因此,本机strictfp组合是方法的非法组合。
- native关键字的主要优点是性能提高,但native关键字的主要缺点是它打破了java的平台无关性。
注: 请仔细阅读java的strictfp关键字,因为这是一个即使是非常优秀的java开发人员也不知道的概念。
在本节中,我们将解释如何在Java中声明本机方法,以及如何生成相应的C/C++函数原型。
语法: 声明本机方法
private native String getLine(String prompt);
语法: 从母语方面
javah -jni PromptJNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);
本文由 比沙尔·库马尔·杜比 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。