Windows 下 JNA 调用动态链接库 dll

1. 创建动态链接库项目

  • 创建jnaTest项目

ac3b5dd2c05763406acf4af321ea8d07.png

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

1a49806eb95201e430019f75538efd8a.png

创建结果

93ad73499a3b901e02772ef648bba33a.png

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);
 }
}

运行结果

48b78c8fd52fb8094df2bab5dc348bbf.png

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

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

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

https://github.com/lucasg/Dependencies

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

9f8eab6be1f436dd387232960197e651.png

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

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

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

8ced15bcabcdb6e4f1208bb09294050f.jpeg

85389ba6ad2daa9753e69d2c7a8cd826.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG弄潮儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值