java通过JNA调用c语言dll

Java可以通过JNI/JNA调用本地其他语言生成的库文件。以调用c语言为例,可以将c的函数导出dll,java通过JNI/JNA来调用。

本文涉及范围

  • window平台
  • Java调用c/c++

JNI vs JNA

JNIJNA
c和Java互调只能Java调c
编写复杂,需要先根据Java生成对应c的函数声明,然后用c来完成函数实现,最后生成dll,供Java调用直接由c生成dll供Java调用
性能优于JNA底层调用JNI

Java通JNA调用dll

  • 编写c代码,导出dll
    // myDll.h
    #define JNADLL extern "C" __declspec(dllexport)
    JNADLL int add(int x, int y);

    // myDll.cpp
    #include "myDll.h"
    void int add(int x, int y)
    {
        return x + y;
    }
  • 编写Java接口代码
    // dll接口
    public interface JNATestDll extends Library   
    {
        JNATestDll instanceDll  = (JNATestDll)Native.loadLibrary("myDll",JNATestDll.class);
        public int add(int x, int y);
    }

    // 测试驱动
    public class CallDLLJNA 
    {
        public static void main(String[] args) 
        {
            JNATestDll jnaDemo=JNATestDll.instanceDll;
            int c = jnaDemo.add(1, 2);
            System.out.println(c);
        }
    }

不得不看

  • 待导出的c函数前一定要添加extern “C”,不然导出的dll JNA找不到

    #define JNADLL extern “C” __declspec(dllexport)
    JNADLL int add(int x, int y);

  • 导出的dll在Java工程的存放路径(任意路径皆可,推荐第一种)

    • lib/win32-x86-64 文件下, 将此文件设为资源文件(此路径在Intellij IDEA上测试过,Eclipse未测试)
    • 将dll所在路径设为环境变量
    • 本地JDK路径下
    • 系统System32文件夹下
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值