你好社区!
这是我的第一篇文章,希望您喜欢它!请注意,这里的所有内容都是关于我对JNI的研究。随意提出建议,更正等:D
很好阅读!^^
从Java代码到C代码的本机调用。
Java上的关键字“本机”允许我们使用JNI。
来调用本机库该文档基于Baeldung帖子,Prof. Gustavo Leitão视频和Oracle关于 jni 的文档。。
1.简介
jni( java本地接口)允许Java访问C和C ++上的代码。
通常用于细节性能案例,处理硬件甚至使用现有库(不需要重写)。
2.“本地”关键词。
当我们与JNI合作时,需要使用本机关键词。
这个关键词对JVM说:“该方法对其他语言具有实现”。
这是本机方法的示例:
public native void myNativeMethod();
本机方法就像摘要一样,其实现将在分离的本机代码文件而不是 .java One中进行。
3.“ system.loadlibrary()”方法。
为了使JVM使用本机代码,必须使用静态方法 system.loadlibrary(String libname)。那将将提供的库从文件系统加载到我们的内存中。
这是一个通话示例:
System.loadLibrary(mylibrary);
非常重要的是,根据参数所提供的库的名称需要遵循某些规则,具体取决于JVM正在执行的平台。例如,让我们假设一个称为“税收计算者”的库。下表显示该示例应使用哪些名称。
系统名称 | 参数值 | 文件的名称(没有空格空格) |
---|---|---|
Windows | 税收计算器 | 税收计算器 .dll |
Solaris | 税收计算器 | lib 税收计算器 .so |
所提供的参数是由 jvm 自动转换的,如列从列“参数值”到“名称文件”。
另外,我们可以使用命令System.load(D:\\my\\library\\path\\libmylibrary.dll)
通过其完全路径找到库。
4.一步一步。
简单介绍之后,让我们通过在Java中创建计算器来做一个简单的示例,但在c。
上进行所有计算4.1。创建Java程序。
第一步是创建我们的Java类并声明其方法要在另一种语言上实现。如前所述,我们需要使用方法System.loadLibrary(mylibrary)
加载库。
请注意,本机方法在这里没有实现,因为它将在稍后在C文件上完成。编译此Java类后,没有错误。
4.2。生成C标头。
Java的编译器允许我们使用以下命令自动生成C标头:
javac Calculator.java -h ../c/
其中:
javac
:执行Java编译器。
Calculator.java
:是需要在C中实现的类
-h
:说明编译器在哪里保存本机标题文件。
../c/
:是要保存标头的路径。
注意:如果您在10之前运行版本,请使用javah
代替javac -h <path>
执行该命令后,生成了一个新的 .h 。在那里,我们可以看到使用“本机”关键词定义为本机的所有方法的签名。
4.3。用本机代码实现方法。
在所有这些步骤之后,现在我们需要为Java声明的方法创建C代码实现。
让我们创建一个新的 .c 文件,在那里,我们包含了生成的标头文件并在其签名之后实现了所有方法的函数。
请注意,方法签名是从生成的标头中复制的,其差异是所有参数已更改为具有可以在代码中引用的名称。
4.4。编译C类。
对于编译C类,我将使用 gcc 。如果您使用的是Windows(像我一样),请使用该step-by-step拖延它。如果您使用的是Linux,则必须已经安装了它。
要编译它,我们可以使用以下命令(您必须为您的情况更改它)。
gcc -o libcalculator.dll -shared -I"your\java\home\include" -I"your\java\home\include\win32" -I"your\project\c" ./Calculator.c;
其中:
gcc
:执行GNU编译器C.
-o
:说明编译器在哪里保存生成的文件。
libcalculator.dll
:是生成文件的名称。
-shared
:说编译器创建共享库。
-I"your\java\home\include"
:是jni.h
的位置,由Calculator.h
使用。
-I"your\java\home\include\win32"
:是windows的jni_md.h
的位置,Calculator.h
也使用。
-I"your\project\c"
:是Calculator.h
的位置,由Calculator.c
使用。
./Calculator.c
:这是我们要编译的文件
所有代码都需要一行执行。之后,将生成一个libcalculator.dll
。
4.5。执行我们的程序。
在所有这些步骤之后,我们能够执行我们的程序。只需在your/project/java
上使用以下命令:
java -Djava.library.path=location/of/libcalculattor Calculator 2 2
注意:如果您使用了System.load
而不是System.loadLibrary
,则不需要提供-Djava.library.path=location/of/libcalculattor
参数。
以下图像显示了工作的应用程序:
这是如何使用 jni 的基本示例。您可以通过单击here查看代码。