在Java中使用native

这个问题在这里已经有了答案:

  • Java中的native关键字是什么? 11个答案

  • 根据我的经验,使用本地代码库的缺点是很重要的:

  • JNI / JNA倾向于破坏JVM的稳定性,特别是如果你尝试做一些复杂的事情。 如果您的本机代码导致本机代码内存管理错误,那么您有可能会导致JVM崩溃。 如果你的本地代码是不可重入的并且被多个Java线程调用,那么不好的事情将会偶尔发生。 等等。

  • 使用本机代码的Java比纯Java或纯C / C ++更难以调试。

  • 原生代码可能会为独立于平台的Java应用程序引入重要的平台依赖性/问题。

  • 本机代码需要单独的构建框架,并且也可能存在平台/可移植性问题。

  • 一般来说,使用本机代码不会获得太多(如果有的话)额外的性能。 虽然您可能认为您的C / C ++比Java更具性能,但JIT编译器在优化这些日子方面做得相当不错,您必须考虑在JNI边界上进行JNI调用和其他交互的性能成本。

    一般来说,您应该将JNI / JNA视为“最后的选择”选项。 如果还有其他解决问题的方法,那可能会更好。


  • 您可能有一个非Java库,无论出于何种原因,您必须在您的Java项目中使用它
  • 您可能需要集成一些旧的或很少使用的硬件,并需要实现可能在C / C ++中更容易的接口
  • 如果你想用本地代码解决性能问题,那么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。

    所以很明显,它可以让你:

  • 使用Java中的任意汇编代码调用编译的动态加载的库(这里用C语言编写)
  • 并将结果返回到Java
  • 这可以用来:

  • 使用更好的CPU汇编指令在关键部分编写更快的代码(不是CPU便携式)
  • 直接进行系统调用(不是OS便携式)
  • 权衡较低的便携性。

    你也可以从C中调用Java,但是你必须首先在C中创建一个JVM:如何从C ++调用Java函数?

    GitHub上的示例供您使用。

    免责声明:这个答案的一部分来自我早先的答案。 我相信我直接回答了OP的问题。

    链接地址: http://www.djcxy.com/p/96823.html

    上一篇: Usage of native in Java

    下一篇: What are native methods in Java and where should they be used?