JNI编程一:JNI开发流程


前言

在平时java开发的时候会调用到底层一些 .so/.dll动态库,这个时候就需要在java层和c/c++层进行交互,为了满足java和c/c++进行通信,就产生了一套java与native层交互的接口,也就是JNI (java native interface)。

JNI开发流程步骤

一、在java文件中编写native方法

我们使用eclipse来编写java代码,通过如下步骤来建立一个java工程:
打开eclipse ——> File菜单 ——> new ——> project… ——> java project ——> next ——> 输入项目名称 jni_demo1 ——>剩下的步骤大家都会了~
这样我们的java项目就建立好了,接下来就创建java类文件了,我们在jin_demo1项目下的src目录里面创建一个java类,取名就叫JniMain.java。
在这里插入图片描述
接下来我们就在JniMain.java文件里面写一个native方法:

public class JniMain {
    
    public native static String getStringFromC();
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
}

这样我们就完成了第一步编写包含native方法的java类文件。


二、使用javah命令生成 .h文件

首先进入cmd命令行工具,
进入的JniMain.java所在目录下,
再输入javah JniMain,
一定要在配置好的java环境下进行。
在这里插入图片描述
这个时候就生成了JniMain.h头文件。

在这里插入图片描述

三、复制.h头文件到cpp工程

接下来的步骤我们要创建一个cpp工程来编写native层代码:

3.1 使用Visual Studio创建一个工程

假设给这个工程取一个名字JNI_Demo1
在这里插入图片描述

3.2 将JniMain.h添加到头文件目录下

在vs右侧的解决方案里面如下图操作添加头文件
在这里插入图片描述
把JniMain.h复制到这个目录下
在这里插入图片描述
在这里插入图片描述

四、引入jni.h和jni_md.h

接下来我们打开JniMain.h文件会发现需要引入一个jni.h的文件,如下图
在这里插入图片描述
这个jni.h头文件在我们安装的jdk目录下有,我们来找到这个头文件

在这里插入图片描述
将这两个文件按照上面第二步的方法添加到头文件目录里面去
在这里插入图片描述
此时jni.h和jni_md.h就被添加到头文件里面了。
最后我们再将JniMain.h文件里面的 #include <jni.h> 改成 #include“jni.h”,因为手动引入非系统库的头文件一般都是用 “ ”
在这里插入图片描述

五、实现.h头文件里面声明的native函数

我们有了头文件里面声明的函数之后,这个时候我们就要去实现它,我就得要创建一个.c文件来编写这个函数的具体内容,假设我们这个.c文件叫做jni_impl.c

在这里插入图片描述
在这里插入图片描述
接下来咋们在jni_impl.c里面实现那个声明的函数,代码如下

#include "stdafx.h"

#include "JniMain.h"

JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC
(JNIEnv * env, jclass jclz){
    return (*env)->NewStringUTF(env, "hello JNI");
}

就是如此简单的代码,我们就实现了native层的编写。

六、生成一个动态库

动态库分为两种,在window平台下一般使用.dll动态库,在linux平台下一般使用.so动态库,本次我们生成一个.dll动态库。

在生成动态库之前,我们需要在vs做一些配置。
首先我们打开配置管理器,设置活动解决方案配置是debug,活动解决方案平台是x64,操作如下
在这里插入图片描述
在这里插入图片描述
然后我们还要设置一下配置类型为的动态库(.dll),如下图

在这里插入图片描述
在这里插入图片描述
然后再生成解决方案
在这里插入图片描述
此时我们会发现一个预编译头报错
在这里插入图片描述
我们只需要再按照如下图配置一下即可
在这里插入图片描述
在这里插入图片描述

接下来继续生成解决方案,就成功执行了
在这里插入图片描述
我们到工程目录下寻找JNI_Demo1.dll动态库,因为我们之前设置的活动解决方案平台是x64,之前我们设置活动解决方案配置是debug,我们可以在工程目录下的x64/Debug文件夹下找到动态库JNI_Demo1.dll。

在这里插入图片描述

七、在java工程中加载动态库

在找到动态库之后,我们就需要把动态库拷贝到java工程里面供使用,我们直接将JNI_Demo1.dll动态库拷贝到jni_demo1工程根目录下。

在这里插入图片描述
接下来,我们再在JniMain.java里面加载动态库,也就是我们最熟悉的那一句话

static{
        System.loadLibrary("JNI_Demo1");
    }

就这么简单动态库就加载起来了~~

八、触发java工程中native函数

最后就是直接调用native方法,我们就能将动态库里面的函数执行了。

public class JniMain {
   
    public native static String getStringFromC();
   
    static{
        System.loadLibrary("JNI_Demo1");
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(getStringFromC());
    }
}

最后的结果就是 hello JNI

在这里插入图片描述
以上就是jni的整个实现流程。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值