Windows 下 JNA 调用动态链接库 dll

简介: Windows 下 JNA 调用动态链接库 dll

1. 创建动态链接库项目

  • 创建jnaTest项目

下一步中填写项目名称和存储的目录;然后直接创建即可

创建结果

2. 定义头文件

#pragma once
#ifndef JNA_TEST_H
#define JNA_TEST_H
#ifdef __cplusplus
extern "C"
{
#endif 
  __declspec(dllexport) int add(int a, int b);
  __declspec(dllexport) void welcome(char* name);
#ifdef __cplusplus
}
#endif 
#endif //JNA_TEST_H

备注: 一定要添加__declspec(dllexport),否则没有导出dll方法;在java调用这个方法时提示:

Exception in thread "main" java.lang.Unsatisfied
LinkError: Error looking up function

可参考文章

https://zhuanlan.zhihu.com/p/50997285

3. 添加cpp文件

#include "pch.h"
#include "JnaTest.h"
#include <string>
int add(int a, int b) {
  return a + b;
}
void welcome(char* name) {
  std::string temp = name;
  printf_s(name);
}

4. 编写java文件

package com.jnademo;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class JnaTest {
  public interface CLibrary extends Library {
    CLibrary INSTANCE = (CLibrary) Native.load("E:\\dllws\\jnaTest\\x64\\Debug\\jnaTest.dll",
        CLibrary.class);
    int add(int a, int b);
    void welcome(String name);
  }
  public static void main(String[] args) {
    int sum = CLibrary.INSTANCE.add(10, 3);
    CLibrary.INSTANCE.welcome("JNA hello world");
    System.out.println(sum);
  }
}

运行结果

5. 如何检查缺少的dll依赖库

在进行生产部署时,有可能出现部署的服务器缺少依赖库的情况,这种情况下需要排查具体缺少哪个依赖库,再根据具体情况安装对应的运行环境。

查看dll或exe所依赖的dll,depends家喻户晓。可惜的是depends不支持win10,使用时直接停止响应。那么在win10上有没有类似工具呢?这里推荐一款开源工具Dependencies,非常的好用。

下载地址

https://github.com/lucasg/Dependencies

使用起来很简单,运行DependenciesGui.exe,然后直接将exe或dll文件拖到窗口中即可。

如果发现缺少应该的dll依赖库;根据具体情况如下地址下载对应版本的Visual C++ Redistributable,安装即可

https://www.microsoft.com/zh-cn/download/details.aspx?id=48145

比如像下图显示就是缺少了依赖库

相关文章
|
3月前
|
关系型数据库 MySQL 开发工具
windows编译poco c++库
windows编译poco c++库
|
3月前
|
存储 Java C语言
Windows 下 JNI 调用动态链接库 dll
Windows 下 JNI 调用动态链接库 dll
64 0
|
4月前
|
安全 Linux 网络安全
Windows本地搭建Emby媒体库服务器并实现远程访问「内网穿透」
Windows本地搭建Emby媒体库服务器并实现远程访问「内网穿透」
|
2月前
|
安全 Linux 网络安全
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
232 0
|
3月前
|
消息中间件 Java Kafka
windows下kafka的环境配置及rdkafka库的应用
windows下kafka的环境配置及rdkafka库的应用
|
4月前
|
网络协议 安全 API
9.9 Windows驱动开发:内核远程线程实现DLL注入
在笔者上一篇文章`《内核RIP劫持实现DLL注入》`介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过`NtCreateThreadEx`这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,`NtCreateThreadEx`函数最终会调用`ZwCreateThread`,本章在寻找函数的方式上有所不同,前一章通过内存定位的方法得到所需地址,本章则是通过解析导出表实现。
69 0
9.9 Windows驱动开发:内核远程线程实现DLL注入
|
5月前
|
开发者 Windows
什么是 Windows 操作系统 DLL 文件的 Side-by-Side Assemblies 技术
什么是 Windows 操作系统 DLL 文件的 Side-by-Side Assemblies 技术
50 0
|
5月前
|
API UED Windows
什么是 Windows 操作系统的 DLL 文件
什么是 Windows 操作系统的 DLL 文件
87 0
|
5月前
|
Unix Linux C#
使用 ABAP + OLE 消费 Windows DLL 文件里的代码和服务
使用 ABAP + OLE 消费 Windows DLL 文件里的代码和服务
27 0
|
Windows
WINDOWS下获得DLL所在目录的代码
WINDOWS下获得DLL所在目录的代码
113 0