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
    
  • 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>

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

<br>

(3)打包为jar包

在这里插入图片描述

3、集成运行

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绿箭柠檬茶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值