JNI(Java Native Interface)入门篇


前言

本篇博客内容,是纯粹的【从零构建dll库文件,到使用】的步骤,没有包含相关的概念解释


一、JNI是什么?

百度百科:

JNI 是Java Native Interface的 缩写,通过使用 Java 本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

JNI 我们一般用来定义本地方法的声明,然后使用 C 、C++ 语言做具体的逻辑编写,实现使用java代码去调用 C 、C++ 代码的效果。

二、环境准备

以下所有操作均是在 windows 环境下,需要安装 gcc 环境,windows 平台下安装 gcc 可以有如下选择

MinGW (下载连接)
Cygwin

注意:搭建GCC编译环境时,一定要选择跟你JDK相对应的版本(32位和64位)否则后面编译后的 dll 文件调用是会报错的

安装完,打开 cmd 验证 gcc 是否可用

gcc -v

三、操作过程

1. Java声明native方法

创建文件 MyJNI.java

注意:native方法如果没有带package,那调用这个库文件的文件也不能带package

package com.liqiye;

public class MyJNI{
	public native void exec();
}

2. 编译生成 class 文件

在 MyJNI.java 文件所在的目录下执行

javac -d . MyJNI.java

执行完,同级目录会生成 com/liqiye/MyJNI.class

3. 编译生成 .h 文件

在 MyJNI.java 文件所在的目录下执行,在类名前面加上包名

javah com.liqiye.MyJNI

执行完,同级目录会生成文件 com_liqiye_MyJNI.h

注意:生成的 .h 文件名是有规则的, package包名_类名.h

4. 手动编写 c 文件

创建 MyJNI.c
(方法里面就是我们具体要实现的逻辑)

#include <stdio.h>
#include "com_liqiye_MyJNI.h"

JNIEXPORT void JNICALL JNICALL Java_com_liqiye_MyJNI_exec(JNIEnv *env, jobject object){
    printf("Hello jni!\n");
}

注意:第二个include是引入当前目录下的.h文件,名字修改成你自己生成的.h文件

5. 编译生成 .o 文件

在 MyJNI.c 文件所在的目录下执行

gcc -c -I"C:\liqiye\software\jdk8\include" -I"C:\liqiye\software\jdk8\include\win32" MyJNI.c

执行完,同级目录会生成文件 MyJNI.o

注意:修改成你自己的jdk目录

6. 编译生成 dll 文件

在 MyJNI.o 文件所在的目录下执行

gcc -Wl,--add-stdcall-alias -shared -o MyJNI.dll MyJNI.o

执行完,同级目录会生成文件 MyJNI.dll

7. 调用 dll 库文件

把刚才生成的 MyJNI.dll 放在 jdk 的 bin 目录 下
(因为下面的 System.loadLibrary() 方法会去运行path环境下,找对应的库文件,而 jdk 的 bin 目录是其中之一)

编写调用的 Test 方法

public class Test {

    public static void main(String[] args) {
        try {
            System.loadLibrary("TestJNI");
            MyJNI test = new MyJNI();
            test.exec();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

看到控制台打印:
在这里插入图片描述

总结

欢迎指出我的错误!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值