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. 자바 쪽


(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) 코드 구현

  • 인터페이스 통합 라이브러리 정의
  • 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 디렉토리에 넣습니다.
  • Linux의 /home/ljn/program/cpp 디렉토리에 패키지된 jar 패키지를 업로드합니다.
    여기에 이미지 설명 삽입
  • 실행: java -jar

추천

출처blog.csdn.net/ljn1046016768/article/details/127692200