七步入门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 <jni.h>
    /* 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 <stdio.h>
    #include <jni.h>
    #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
    在这里插入图片描述

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

  • 第七步,启动项目

注意事项

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢来 mml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值