java通过JNA调用c语言dll

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

本文涉及范围

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

JNI vs JNA

JNI JNA
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文件夹下

你可能感兴趣的:(java)