JNI 运行机制

JNI( java native interface) 

JNI Java本地方法调用接口,很明显是用来调用非java方法的接口,通过JNI我们可以调用本地的c/c++ 方法,从而实现高效的操作。C/C++是通过调用系统级的API进行操作,与系统指令密切相关。这里也可以看出C/C++的高效原因,java则是一次写,到处运行,跨平台的高级语言。

  • 由于java的跨平台特性,也造就 了运行的效率不如C/C++。在某些高效操作方面,java就可以通过直接调用C、C++的函数提升关键代码的性能。

  • JNI 是如何调用C、C++提供的函数呢?

  • java中标记为native的方法俗称本地方法,就是通过JNI 调用。

  • jvm通过将native方法链接到C 函数上,进行调用。

  • 那么是怎么链接的呢?

  • 二种方式。

  • jvm 通过自动查找找到按照一定命名规范的C函数,进行链接。

    package demo;
    
    public class Test {
    
    	public native void add(int i,String s);
    public native void add2(String s);
    }
    

     

  •  命名规范上述本地方法名就是 Java_com_demo_Test_add_i. 以Java_为前缀,跟完整的包的类名,方法名。.则使用_代替,如果原来方法有下划线则_使用_1代替。引用类型参数为_2.

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class demo_Test */
    
    #ifndef _Included_demo_Test
    #define _Included_demo_Test
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     demo_Test
     * Method:    add
     * Signature: (ILjava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_demo_Test_add
      (JNIEnv *, jobject, jint, jstring);
    JNIEXPORT void JNICALL Java_demo_Test_add2
      (JNIEnv *, jobject, jstring);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

     

  • 2、在C代码中主动链接。

  •  

 


版权声明:本文为m0_37948170原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。