What are native methods in Java and where should they be used?
本机方法与抽象方法具有相同的语法,但它在何处实现?
What are native methods in Java and where should they be used?
一旦你看到一个小例子,它变得清晰:
Main.java:
1 2 3 4 5 6 7
| public class Main {
public native int intMethod (int i );
public static void main (String[] args ) {
System. loadLibrary("Main");
System. out. println(new Main (). intMethod(2));
}
} |
MAIN.C:
1 2 3 4 5 6 7
| #include <jni.h>
#include"Main.h"
JNIEXPORT jint JNICALL Java_Main_intMethod(
JNIEnv *env, jobject obj, jint i) {
return i * i;
} |
编译并运行:
1 2 3 4 5
| javac Main.java
javah -jni Main
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/linux Main.c
java -Djava.library.path=. Main |
输出:
使用Oracle JDK 1.8.0_45在Ubuntu 14.04上进行了测试。
所以很明显它允许你:
-
使用Java中的任意汇编代码调用已编译的动态加载库(此处用C语言编写)
-
并将结果返回Java
这可以用于:
-
使用更好的CPU汇编指令(不是CPU便携式)在关键部分编写更快的代码
-
进行直接系统调用(不是OS便携式)
与低便携性的权衡。
您也可以从C调用Java,但必须首先在C中创建JVM:如何从C ++调用Java函数?
GitHub上的示例供您玩。
-
它工作得很好.....你做得很好兄弟...我已经尝试过这么多教程,但没有得到一个有效的例子
-
@dom谢谢!我想这是因为它是高度依赖系统的东西。这就是为什么我总是说测试发行版的版本:-)
-
@Ciro:什么是JNIEXPORT jint JNICALL。它是用于本机应用程序的语法。
-
在jni.h中定义的@niks东西。看起来像推荐/最便携的方式。不知道它在哪里记录,会欣赏一个链接。
该方法以"本机"代码实现。也就是说,代码不能在JVM中运行。它通常用C或C ++编写。
本机方法通常用于与系统调用或用其他编程语言编写的库进行交互。
-
你的意思是如果我在我的类中有一个本地方法forName,它的实现是系统调用的一部分。是否应该使用本机方法作为系统调用的名称
-
不完全是。如果在名为"com.example.Foo"的类中有一个名为"forName"的方法,那么将被调用的C函数将被命名为"Java_com_example_Foo_forName"。然后该函数可以调用系统调用。请参阅docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/…更多细节。
-
如果本机方法是用其他名称实现的,如在C中的示例Java_com_example_Foo_forName中,我们如何知道我们给出的本机方法(forName)的名称是否正确使用。我的意思是Java_com_example_Foo_forName具有完全不同的名称,它看起来像C中的本地方法,人们可能会把它理解为它??自己的方法的实现而不是具有相同名称的实现。你解释的是我清楚地知道但是我无法理解实施是如何进行的。
-
通常,您无法在不查看文档和/或源代码的情况下告诉本机方法将调用什么,就像任何其他方法一样。仅因为它被称为"forName"并不意味着它将调用该名称的系统调用,但人们希望作者会使用合理的命名约定。顺便说一下,当我说他们习惯于与系统调用接口时,我并不是说他们必须与系统调用一对一。与系统调用的接口只是本机方法的常见用法。
-
假设我们想调用一些系统函数,baz。首先,使用本机方法bar创建一个名为com.example.Foo的类。然后编写一个C函数,Java_com_example_Foo_bar调用baz。编译并将C函数链接到共享库(例如:libquux.so或quux.dll)。在调用bar本机方法之前,您的Java代码必须调用System.loadLibrary("quux")(否则将抛出UnsatisfiedLinkError)。在这个例子中,只要允许,我就会使名称不同,但实际上,类和库的名称和函数和方法的名称相同。
-
现场劳伦斯得到了概念清理。
I like to know where does we use Native Methods
理想情况下,完全没有。实际上,Java中没有某些功能,您必须调用一些C代码。
这些方法用C代码实现。
-
doe ==代码? :)
-
@CiroSantilli六四事件法轮功是的,谢谢。
-
为你的幽默感投票(第一线)
Java本机代码必需品:
-
h / w访问和控制。
-
使用商业软件和系统服务[h / w相关]。
-
使用没有或不能移植到Java的传统s / w。
-
使用本机代码执行时间关键任务。
希望这些要点回答你的问题:)
-
I / O怎么样?或者这是否使用"没有或不能移植到Java的传统s / w"。我想知道因为FileNotFoundException类有本机I / O方法。
-
@RnBandCrunk:是的,你是对的。 I / O通常依赖于系统,必须使用本机方法来实现这些操作。
本机方法允许您在Java代码中使用来自其他语言(如C或C ++)的代码。当java不提供您需要的功能时,您可以使用它们。例如,如果我正在编写一个程序来计算某个方程并创建它的线图,我会使用java,因为它是我最好的语言。但是,我也精通C.在我的一部分说程序我需要计算一个非常复杂的方程式。我会使用本机方法,因为我知道一些C ++,我知道C ++比java快得多,所以如果我用C ++编写我的方法会更快。另外,假设我想与其他程序或设备进行交互。这也可以使用本机方法,因为C ++有一些叫做指针的东西,让我这样做。