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) コードの実装
- インターフェース統合ライブラリの定義
- 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) ジャーパッケージで包装
3. 統合運用
- 生成されたダイナミック リンク ライブラリを Linux の /home/ljn/program/cpp ディレクトリに配置します。
- パッケージ化されたjarパッケージをLinuxの/home/ljn/program/cppディレクトリにアップロードします。
- 実行: java -jar