在Java中使用native
这个问题在这里已经有了答案:
根据我的经验,使用本地代码库的缺点是很重要的:
JNI / JNA倾向于破坏JVM的稳定性,特别是如果你尝试做一些复杂的事情。 如果您的本机代码导致本机代码内存管理错误,那么您有可能会导致JVM崩溃。 如果你的本地代码是不可重入的并且被多个Java线程调用,那么不好的事情将会偶尔发生。 等等。
使用本机代码的Java比纯Java或纯C / C ++更难以调试。
原生代码可能会为独立于平台的Java应用程序引入重要的平台依赖性/问题。
本机代码需要单独的构建框架,并且也可能存在平台/可移植性问题。
一般来说,使用本机代码不会获得太多(如果有的话)额外的性能。 虽然您可能认为您的C / C ++比Java更具性能,但JIT编译器在优化这些日子方面做得相当不错,您必须考虑在JNI边界上进行JNI调用和其他交互的性能成本。
一般来说,您应该将JNI / JNA视为“最后的选择”选项。 如果还有其他解决问题的方法,那可能会更好。
如果你想用本地代码解决性能问题,那么99.5%的机会是错误的方法;-)
有人可以解释在Java中使用native关键字的原因和原因吗?
一旦你看到一个小例子,就会明白:
Main.java :
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 :
#include <jni.h>
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_intMethod(
JNIEnv *env, jobject obj, jint i) {
return i * i;
}
编译并运行 :
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
输出 :
4
使用Oracle JDK 1.8.0_45测试Ubuntu 14.04。
所以很明显,它可以让你:
这可以用来:
权衡较低的便携性。
你也可以从C中调用Java,但是你必须首先在C中创建一个JVM:如何从C ++调用Java函数?
GitHub上的示例供您使用。
免责声明:这个答案的一部分来自我早先的答案。 我相信我直接回答了OP的问题。
链接地址: http://www.djcxy.com/p/96823.html下一篇: What are native methods in Java and where should they be used?