七步入门JNI

JNI使用方法记录

文章目录

  • JNI使用方法记录
    • JNI是用来干嘛的
    • 怎么在自己的代码中使用JNI
    • 注意事项

JNI是用来干嘛的

JNI 全称是Java Native Interface,中文译名叫java本地接口。
当需要实现一些Java语言难以完成的事情时,就可以考虑使用JNI来调用其他的语言库来实现。

怎么在自己的代码中使用JNI

本文将简洁地展示使用JNI调用dll的过程。

  • 第一步,编写有native方法的类
    文件HellpJNI.java内容如下:
    public class HelloJNI {
    /**
     * 这是native方法,稍后会在要导入的dll中定义方法体
     */
    native public void sayHello();
    
    public static void main(String[] args) {
    	//	这里打印java的library,dll是在library目录里进行查询
    	System.out.println(System.getProperty("java.library.path"));
    	HelloJNI h = new HelloJNI();
    	//	导入dll
    	//	用System.load 或者 System.loadLibrary 进行导入dll
    	System.loadLibrary("HelloJNI");
    	//	调用native方法
    	h.sayHello();
    }
    

}
```

  • 第二步,将第一步中的类编译为class文件

    javac HelloJNI.java
    

    这一步会生成HelloJNI.class文件

  • 第三步,使用javah按照第二步的class文件中的native方法定义生成c语言的头文件

    javah HelloJNI
    

    这里会生成一个.h文件HelloJNI.h,该文件内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include 
    /* Header for class HelloJNI */
    
    #ifndef HelloJNI
    #define HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloJNI
     * Method:    sayHello
     * Signature: ()V
     */
     // 这里是函数的定义
    JNIEXPORT void JNICALL HelloJNI_sayHello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    
  • 第四步,按照第四步的.h文件中的函数定义,定义函数体
    文件HelloJNI.c内容如下:

    #include 
    #include 
    #include "com_wby_wincontrol_jni_HelloJNI.h"
    
    JNIEXPORT void JNICALL HelloJNI_sayHello
      (JNIEnv *param, jobject object){
        printf("hello");
        return;
      }
    
  • 第五步,将第四步的.c文件生成动态链接库dll

    gcc -shared -I %JAVA_HOME%/include -I %JAVA_HOME%/include/win32 HelloJNI.c -o HelloJNI.dll
    

    -shared表示生成动态链接库
    -o表示输入的文件名
    -I表示头文件的查询路径,以上两个路径是java JNI 必要的头文件,因为没有添加到gcc的查找路径里,所以需要手动指定路径

    这一步会生成HelloJNI.dll文件

  • 第六步,将dll添加到java项目的library中
    如果你使用的是IDEA或者Eclipse,可以直接添加到library中
    如IDEA,进入project structure ,按照下图,选择dll文件后一路点击ok
    七步入门JNI_第1张图片

    如果直接使用java命令启动,可以将dll所在目录添加到系统的环境变量

  • 第七步,启动项目

注意事项

  • native方法调用前,必须要引用dll文件,这个引入的操作,不一定在这个类加载的时候引入,意思是可以在其他类中使用System.loadLibrary()方法引入
  • native方法调用时,如果dll中没有定义,会报错;如果未定义但是不调用,则不会报错
  • System.load()的参数是dll的绝对路径;System.loadLibrary()的参数是dll的文件名
  • System.getProperty("java.library.path") 其实就是系统环境变量path中的目录

你可能感兴趣的:(JAVA,开发,JNI)