
Java(0)---调用C++动态链接库-windows--JNIDemo
Java 调用 C++ 代码的实现方式Java 可以通过 JNA 或者 JNI 的方式实现对 C++ 代码的调用,当然还有其他方式,这个我就没怎么了解了,大家可以自己去研究。这里介绍以下两种方式实现 Java 对 C++ 的调用:Linux(Centos 7) 下 Java 通过 JNA 的方式调用 C++;Windows10 下 Java 通过 JNI 的方式调用 C++。
Java 调用 C++ 代码的实现方式
Java 可以通过 JNA 或者 JNI 的方式实现对 C++ 代码的调用,当然还有其他方式,这个我就没怎么了解了,大家可以自己去研究。
这里介绍以下两种方式实现 Java 对 C++ 的调用:
Linux(Centos 7) 下 Java 通过 JNA 的方式调用 C++;
Windows10 下 Java 通过 JNI 的方式调用 C++。
JNA 的底层实现其实就是 JNI,可以理解为 JNA 把 JNI 进行了封装,使得 Java 调用 C++ 更简单方便,但是 JNA 效率要比 JNI 低不少。
C++ 代码中需要被 Java 调用的方法必须使用 extern "C"
修饰,否则会出现找不到该方法的错误,extern "C"
的意思是让 C++ 代码以 C 的方式编译。
1.实现步骤:
基本就3步。
- 编写 Java 代码 native 方法,并编译生成 .h 头文件;
2.编写 C++ 代码,实现 .h 头文件的方法,并编译 C++ 代码生成 .dll 动态链接库;
3.Java 代码加载 .dll 文件,完成对 C++ 的调用。
1. 1C++动态库---编写 C++ 代码:
首先,编写所需的 C++ 代码,实现所需的功能。可以使用 C++ 编译器将代码编译为动态链接库(.dll 或 .so 文件),供 Java 程序调用。
1.2. JAVAapplicant---创建 Java Native 方法:
JAVA中 关键字:Native
public class NativeExample {
public native void nativeMethod();
}
在 Java 代码中声明本地方法,并使用 `native` 关键字标记。例如:
1.3 JAVAapplicant---生成 C++ 头文件:
在命令行中使用 `javac` 命令生成 C++ 头文件,例如:
javac -h . NativeExample.java
1.4. C++动态库---实现本地方法:
在 C++ 中实现 Java Native 方法,根据生成的头文件进行函数声明和实现,例如:
#include <jni.h>
JNIEXPORT void JNICALL Java_NativeExample_nativeMethod(JNIEnv* env, jobject obj) {
// 在这里实现所需的 C++ 代码逻辑
}
1.5. C++动态库-----编译和链接 C++ 代码:
使用 C++ 编译器将 C++ 代码编译为动态链接库。具体编译和链接步骤取决于你所使用的编译器和操作系统。
1.6. JAVAapplicant---加载和调用本地方法:
在 Java 代码中加载动态链接库,并调用本地方法。例如
public class NativeExample {
static {
System.loadLibrary("nativeLibrary"); // 加载动态链接库
}
public native void nativeMethod();
public static void main(String[] args) {
NativeExample example = new NativeExample();
example.nativeMethod(); // 调用本地方法
}
}
2.实例:
JAVAapplicant:MtkHidUsbProject----c++桥接动态库mtkhideUsbBridge---c++动态库mtkHidUsb
在JAVA 项目MtkHidUsbProject中调用C++动态库mtkHidUsb
2.1.VS 创建DLL编写C++代码:mtkHidUsb
创建一个动态库:mtkHidUsb 默认配置
创建头文件和源文件:
2.2.创建java项目:MtkHidUsbProject
java applicantion

新建包+新建类 mtkUsbJNI
MtkUsbJNI 是用来放JAVA调用C++代码连接的那些接口函数
此类用JNI结尾
C++接口用于扫描底层设备的数量
scanDevice();
2.3.把.java文件转成C++的头文件,仍然在java项目中。
javac -h . mtkusbjni.java
生成的c++文件。
2.4.新建C++动态链接库项目mtkhideUsbBridge
在 C++ 中实现 Java Native 方法,根据生成的头文件进行函数声明和实现,例如:
#include <jni.h>
JNIEXPORT void JNICALL Java_NativeExample_nativeMethod(JNIEnv* env, jobject obj) {
// 在这里实现所需的 C++ 代码逻辑
}
头文件直接放这。
2.4.1 MtkHidUsbBridge.dll
用于实现java函数的。
2.4.2MtkHidUsb.dll
添加了新的头文件和cpp文件。
把c+动态链接库复制到java目录下。
拷贝到桥接目录下:
项目里添加头文件。
修改文件:
把编译好的链接库复制到JAVA下运行一下。
2.4.3JAVA调用的时候需要
JAVA,exe:MtkUsb
C++,dll: MtkHiUsb, 实现函数,不需要。
MtkHiUsbBridge 接口 ,需要JAVA生成的C++class,
需要C++动态链接库MtkHiUsb的头文件。
把java生成的头文件放进来:
创建.cpp文件
关联动态库:
引用接口头文件:
JNI生成的接口头文件。
里面有一个方法对应之前的一个JAVA方法
此时生成了一个链接库。
生成的链接库拷贝到JAVA项目的根目录下:
2.5.JAVA下新建测试类
JNI接口做个封装
mtkUsbJNI.java
mtkUsb.java
mtkHidUsbTest.java
未被加载的话就会如下报错:
添加加载:
加载动态库,不加后缀.dll。
32和64是不能混的。
3.C++引用动态库的方法
3.1头文件包含目录(.H)+库目录(.DLL)+附加依赖项(.lib)
被调用的动态库输出函数
头文件:
#pragma once
__declspec(dllexport) int scanDevice();
亲测可行的实例代码:
https://download.csdn.net/download/aggie4628/88990566?spm=1001.2014.3001.5501
更多推荐
所有评论(0)