Java中的本机关键字
Java中的 native 关键字应用于方法,表示该方法是使用 JNI(Java Native Interface)在本机代码中实现的。 native 关键字是仅适用于方法的修饰符,我们不能将其应用于其他任何地方。用 C、C++ 实现的方法称为本地方法或外来方法。
native 修饰符表示方法是在依赖于平台的代码中实现的,这在 C 语言中很常见。 Native 修饰符表示方法是在依赖于平台的代码中实现的,通常在 C 中。
原生关键字的主要目标
- 以提高系统的性能。
- 实现机器级/内存级通信。
- 使用已经存在的遗留非 Java 代码。
Conclusion: Java application scan call code is written in C, C++, or assembler.
创建原生方法的步骤如下:
- 编写Java代码
- 编译Java代码。
- 创建 C 头文件(.h 文件)
- 创建 C 存根文件(使用工具: Java HEdge)
- 编写C代码
- 创建共享代码库 (DLL)
- 运行应用程序
实现: 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;
}
Note: DLL is named as can be perceived from program 1A: NameOfDLLFile
输出:
Before native method: var = null
After native method: var = 10
请记住,关于原生关键字有一些要点,如下所示:
- 对于本机方法,已在 C、C++ 等旧语言中提供实现,我们不负责提供实现。因此,本机方法声明应以 ; 结尾(分号)。
- 我们不能将本机方法声明为抽象的。
- 我们不能将本地方法声明为 strictfp,因为不能保证旧语言(C、C++)遵循 IEEE 754 标准。因此,本机 strictfp 组合是方法的非法组合。
- native 关键字的主要优点是性能提升,但 native 关键字的主要缺点是它打破了Java的平台无关性。
Note: Do go through strictfp keyword of java as is one of the concept which even very good java developer is unaware of.
在本节中,我们将解释如何在Java中声明本机方法以及如何生成相应的 C/C++函数原型。
语法:声明本机方法
private native String getLine(String prompt);
语法:从母语方面
javah -jni Prompt
JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);