Java使用JNI(Java Native Interface)调用C/C++函数

1.JNI的基本认识。

JNI即Java Native Interface(Java本地接口),主要作用为:它允许Java代码和其他语言写的代码进行交互。本文主要使用Java调用c/c++代码(类库)。

2.具体实现

2.1 首先在本地任意的一个目录下创建2各类JNI.java 和Test.java,我在D:\JNITest目录下创建了这两个文件

//JNI.java文件
public class JNI{
   //创建一个native接口方法,此方法在C++代码中实现
   public native int call();
   // 定义原生getName方法,返回值是String,有两个入参
   public native String getName(String name, int sex);
   //静态代码块,加载由C++代码生成的.dll动态链接文件(.dll相当于Java中的jar包吧...)
   static{
       System.loadLibrary("JNIdll");
   }
}
//Test.java文件
public class Test{
    public static void main(String[] args){
        //创建JNI的对象call
        JNI call = new JNI();
        //调用call()方法;
        int i = call.call();
        //输出调用后的结果i
        System.out.println("调用Java Native Interface,返回:"+i);
        System.out.println("调用Java Native Interface,返回:"+call.getName("guohui",27));
    }
}

我的目录如下:

 2.2 使用javac 编译JNI.java生成字节码文件JNI.class(需要安装配置java环境变量)并使用javah 编译刚生成的字节码文件得到JNI.h文件,具体操作如下:

  • 在JNI.java源文件目录下打开命令框(cmd),可以cd切换到该目录也可以通过下面的方法直接打开该目录:

  • javac编译(得有java环境)
  • javah 编译刚才的JNI.calss字节码文件,注意不要后缀名

  • 用Notepad++打开JNI.h文件看看:

 2.3 编写C++代码(JNIdll.cpp文件)来实现JNI.java中的call()方法(native修饰的)

//JNIdll.cpp文件

#include<stdio.h>
#include<jni.h>
#include "JNI.h"

JNIEXPORT jint JNICALL Java_JNI_call
(JNIEnv *, jobject) {
	//实现代码
	int i = 777;
	return i;
}
JNIEXPORT jstring JNICALL Java_JNI_getName
(JNIEnv *env, jobject, jstring jstr, jint sex) {
	//实现代码
	printf("received first:%d second:%d\n", 1, sex);
	printf("received first:%s second:%d\n", env->GetStringUTFChars(jstr,false), sex);
	return jstr;
}

2.4 使用C++编译器生成.dll动态链接文件

首先需要有C++的编译器,因为我的电脑上装了Visual Studio 2017,所以有C++的编译器,需要使用 cl 命令,所以先将cl的目录路劲设置到系统的path环境变量中,不然系统不识别此命令(提示cl不是内部或者外部命令),目录路径如下:

  • 需要将java目录下的include目录下的两个文件jni.h和jni_md.h(jni_md.h在include目录下的win32目录中)拷贝到vc的include目录下

 需要注意这两个文件可能存在:jdk1.8.0_211\include目录,也可能像我截图的分别在不同的目录自己找到就行了

把这两个文件拷贝到VC的include目录下

 2.5 这一步主要是去编译.cpp生成动态链接文件

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱钓鱼的程序员小郭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值