美文网首页程序员日更挑战集锦Java
Java | 通过JNA调用c语言dll

Java | 通过JNA调用c语言dll

作者: 峰眼看世界 | 来源:发表于2020-02-28 00:11 被阅读0次
    java

    之前发在我的CSDN博客中,现在搬到简书上来。

    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 | 通过JNA调用c语言dll

        本文链接:https://www.haomeiwen.com/subject/wfdrqhtx.html