• JAVA通过JNA 调用c++动态链接库


    JAVA通过JNA 调用c++动态链接库


    1、c++动态链接库编译


    (1)动态链接库运行原理

    在这里插入图片描述

    (2)编译命令


    • gcc -fPIC -i $JAVA_HOME/include -i $JAVA_HOME/include/linux -shared -o lib(name).so (动态链接库名).c

      	gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o libhello.so hello.c
      
      • 1
    • PIC使.so文件的代码段变为真正意义上的共享,在一些架构上是无法在不加-fPIC选项的情况下构建共享库的。


    2、java端


    (1)导入依赖

      <dependencies>
            <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
            <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>5.11.0</version>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)代码实现

    • 定义接口集成Library
    • 使用Native.load 加载动态链接库
    • 接口中定义需要使用的函数
    package com.ljn.Jna;
    
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    
    /**
     * 运行环境是linux,需要打包生成jar文件放到linux环境运行
     */
    class HelloJNA {
    
        /**
         * 定义一个接口,默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary
         * 这个接口对应一个动态链接(SO)文件
         */
        public interface LibraryAdd extends Library {
            // 这里使用绝对路径加载动态链接库
            LibraryAdd LIBRARY_ADD = Native.load("/home/ljn/program/cpp/libhello.so", LibraryAdd.class);
    
            /**
             * 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义
             * 映射libadd.so里面的函数,注意类型要匹配
             */
            int add(int a, int b);
        }
    
        public static void main(String[] args) {
            // 调用so映射的接口函数
            int add = LibraryAdd.LIBRARY_ADD.add(10, 15);
            System.out.println("相加结果:" + add);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    • 1

    (3)打包为jar包

    在这里插入图片描述

    3、集成运行

    • 将生成的动态链接库放在linux中的/home/ljn/program/cpp目录下
    • 上传打包好的jar包在linux中的/home/ljn/program/cpp目录下
      在这里插入图片描述
    • 运行:java -jar

  • 相关阅读:
    spring mvc源码分析之请求分发
    大数据面试题
    数据库公共字段自动填充
    带你走进 ERNIE
    【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示
    读写锁ReentrantReadWriteLock
    BUUCTF misc 专题(106)[MRCTF2020]Unravel!!
    Flink SQL 自定义 Connector
    幻兽帕鲁服务器多少钱?有买过的吗?
    1625. 执行操作后字典序最小的字符串-枚举
  • 原文地址:https://blog.csdn.net/ljn1046016768/article/details/127692200