Java(0)---调用C++动态链接库-windows--JNIDemo

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步。

  1. 编写 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



 

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值