Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo 您所在的位置:网站首页 java调用dll函数 Java通过JNI调用C++动态链接库(第三方库)实现全过程Demo

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

2024-07-15 09:54| 来源: 网络整理| 查看: 265

文章目录 步骤(思路)1.创建C++动态链接库(DLL)1.1新建动态链接库1.2配置动态链接库 2.创建C++中间件(动态链接库)2.1创建中间件2.2配置中间件 3.Java调用C++动态链接库(第三方库)3.1新建一个空项目(省略)3.2配置Java项目 4.源代码

步骤(思路)

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.源代码

点这里



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有