Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo

步骤(思路)

1、创建c++动态链接库,实现一些功能的封装,例如扫描设备,作为第三方库来使用
2、创建c++中间件(本质也是DLL),用来调用和进一步的封装第三方库,添加一些业务逻辑等
3、创建一个java项目,用于调用C++动态链接库(第三方库)的功能

1.创建C++动态链接库(DLL)

1.1新建动态链接库

1、打开visual studio,创建新项目,选择动态链接库(DLL),点击下一步
在这里插入图片描述
2、修改项目名称和位置,点击创建
在这里插入图片描述

1.2配置动态链接库

3、右键源文件,选择添加->新建项
在这里插入图片描述
4、选择C++类,名称为WindowsHidUsb,点击添加
在这里插入图片描述
5、编写pch.h、WindowsHidUsb.h和WindowsHidUsb.cpp文件
pch.h

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"
#define API_DLL  _declspec(dllexport)

#endif //PCH_H

WindowsHidUsb.h

#pragma once
#include "pch.h"

API_DLL int scanDevice();

WindowsHidUsb.cpp

#include "WindowsHidUsb.h"
#include "pch.h"

API_DLL int scanDevice() {
    
    
	return 2;
}

6、右键项目,点击生成
在这里插入图片描述

2.创建C++中间件(动态链接库)

2.1创建中间件

创建步骤同上,项目名称为MtkHidUsbBridge,添加一个名为MtkHidUsbBridge的cpp文件

2.2配置中间件

1、右键项目,点击属性
在这里插入图片描述

2、VC++目录-包含目录-编辑
在这里插入图片描述
3、点击添加,将本地java的jdk的include、include\win32和目录添加进去
在这里插入图片描述
4、右键头文件,添加之前编写的WindowsHidUsb.h头文件到该项目的头文件夹下,并编写MtkHidUsbBridge.cpp文件和WindowsHidUsb.h头文件
(1)MtkHidUsbBridge.cpp

#include "pch.h"
#include "com_mtk_api_usb_MtkUsbJni.h"
#include "WindowsHidUsb.h"

JNIEXPORT jint JNICALL Java_com_mtk_api_usb_MtkUsbJni_scanDevice
(JNIEnv*, jobject) {
    
    
	return scanDevice();
}

(2)WindowsHidUsb.h头文件,其中将相对路径替换成自己的相对路径即可

#pragma once

#if  defined(WIN32)
 #if defined(DEBUG)
#pragma comment(lib,"../../MtkHidUsb/x64/Debug/MtkHidUsb.lib")
#pragma message("完成与MtkHidUsb.lib的连接")
#else
#pragma comment(lib,"../../MtkHidUsb/x64/Release/MtkHidUsb.lib")
#pragma message("完成与MtkHidUsb.dll的连接")
#endif
#endif //  defined(WIN32)


 int scanDevice();


5、右键项目,点击生成,生成目录如下,先记住,下一步会用到
在这里插入图片描述

3.Java调用C++动态链接库(第三方库)

3.1新建一个空项目(省略)

创建过程,无脑next即可(有手就行)

3.2配置Java项目

1、在com.mtk.api.usb的文件夹下,右键新建一个MtkUsbJNI.java类,如下

package com.mtk.api.usb;//与自己的文件夹结构对应

class MtkUsbJni {
    
    
    native int scanDevice();
}

2、打开dos窗口,找到java项目的src目录下,在地址栏输入cmd回车即可,输入以下命令

javah -jni -encoding UTF-8 com.mtk.api.usb.MtkUsbJNI

其中,com.mtk.api.usb.MtkUsbJNI为你java项目下MtkUsbJNI类的实际包路径
在这里插入图片描述
3、将生成的com_mtk_api_usb_MtkUsbJni.h头文件添加到MtkHidUsbBridge的头文件目录下,
右键头文件-添加-现有项-找到后添加,并再次配置项目(将该头文件的存放目录添加到VC++目录-包含目录中)
在这里插入图片描述
在这里插入图片描述
4、将生成的MtkHidUsbBridge.dll添加到java项目的根目录下
5、在com.mtk.api.usb包下,新建如下的MtkUsb类

package com.mtk.api.usb;


public class MtkUsb {
    
    
    private static final MtkUsb mtkUsb = new MtkUsb();
    public static MtkUsb getInstance(){
    
    
        return mtkUsb;
    }
    private static final MtkUsbJni mtkUsbJni = new MtkUsbJni();
    public int scanDevice(){
    
    
        return mtkUsbJni.scanDevice();
    }
}

6、在com.mtk.test包下,新建一个测试类

package com.mtk.test;
import com.mtk.api.usb.MtkUsb;

public class MtkHidUsbTest {
    
    
    public static void main(String[] args) {
    
    
        System.loadLibrary("MtkHidUsb");
        System.loadLibrary("MtkHidUsbBridge");
        System.out.println("Device Count=" + MtkUsb.getInstance().scanDevice());
    }
}

6、将上边生成的两个动态链接库,MtkHidUsbBridge.dll和MtkHidUsb.dll拷贝到java的根目录下,右键运行即可
在这里插入图片描述

4.源代码

点这里

猜你喜欢

转载自blog.csdn.net/qq_52431815/article/details/131701586
今日推荐