我们一起谈谈 JNA 调用动态链接库
在一次实际项目中遇到了无法调用exe可执行文件,听说哥斯拉利用JNA技术实现了内存加载exe、执行命令等操作,特来实践一下。 JNA 基础知识 JNA全称:Java Native Access,是建立在JNI(Java Native Interface)技术之上的Java开源框架,JNA提供了一组Java工具类用于在运行期间动态访问的系统本地库。简单理解就是:JNA提供了一个"桥梁",可以利用Java代码直接访问动态链接库中的函数。 调用JNI接口 调用JNI接口的步骤为: 创建工程,将dll文件放到工程下 引入JNA相关的jar包 创建继承自Library类的接口 接口中创建对象用于加载DLL/SO的类库 接口中声明DLL/SO类库头文件中暴露的方法 调用该方法 编译DLL 以windows为例,使用Visual Studio 创建一个动态链接库的工程,并定义一个头文件testdll.h和源文件testdll.cpp。简单实现一个SayHello的方法创建testdll.cpp,作用是用来实现被声明的函数。 #include "pch.h" #include "testdll.h"
void SayHello() { std::cout << "Hello!你成功了!" << std::endl; } 创建testdll.h头文件,作用是用来声明需要导出的函数接口 #pragma once #include <iostream> extern "C" __declspec(dllexport) void SayHello(); //声明一个可被调用的函数“SayHello()”,它的返回类型是void。 //extern "C"的作用是告诉编译器将被它修饰的代码按C语言的方式进行编译 //__declspec(dllexport),此修饰符告诉编译器和链接器被它修饰的函数或变量需要从DLL导出 而后编译出dll。注意:要DLL位数要与JDK位数相同,否则无法调用。 导入JAR包 首先创建java工程,可以是普通项目也可以是maven功能。maven 需要导入依赖 <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency> 普通工程可以在 https://github.com/java-native-access/jna 下载jna jar包和platform jar包并导入。 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |