文章目录
步骤(思路)
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的根目录下,右键运行即可