Springboot プロジェクトで xxx.so ファイルを呼び出す際の一般的な問題

# プロジェクトのシナリオ: springboot プロジェクトが xxx.so ファイルを呼び出す一般的な問題


序文

この章では主に、Java プロジェクトで .so クラス ライブラリを呼び出すために System.loadLibrary("xxx") を使用する必要があること、統合プロセスで発生した問題、および問題の解決策について説明します。

1.loadLibrary()とは何ですか?

loadLibrary() メソッドは、このメソッドに渡されるパラメータとして library_name (ライブラリ名) という名前の指定されたパラメータを使用してライブラリをロードするために使用されます。Java ファイルには、loadLibrary() メソッドを使用してこのライブラリをロードするために必要なネイティブ コードが含まれています。このメソッドでは、library_name から指定されたファイル名へのマッピングがシステム固有の方法で行われます。クラスがロードされてインスタンス化されると、ネイティブ メソッドに必要な実装されたネイティブ コードもロードされます。

2. .so ファイル インスタンスをロードします。

1. コードのロード

まず第一に、libidg_java.so ファイルが必要です
。com.oak パッケージのパスは .so ファイルに従って固定されます。ファイルがそれよりも優れたものになると、対応するパッケージを見つけるためのパッケージ パスとパス名が表示されます。 idgクラスのメソッドは.soの実装に対応しており
、業務に応じて実現可能

package com.oak;

public class idg {
    
    
	static {
    
    
		System.loadLibrary("idg_java");
	}

	public native long init(byte[] name, int major, int minor, int build, byte[] authcode, byte[] conf_base_path, byte[] log_base_path);
	
	public native long fini();
	
	public native long getlicence();
	
	public native long donglecheck();
		
	public long jinit(String name, int major, int minor, int build, String authcode, String conf_base_path, String log_base_path)
	{
    
    
		return init(name.getBytes(), major, minor, build, authcode.getBytes(), conf_base_path.getBytes(), log_base_path.getBytes());
	}
	public long jfini()
	{
    
    
		return fini();
	}
	public long jget_licence()
	{
    
    
		return getlicence();
	}
	
	public long jdongle_check()
	{
    
    
		return donglecheck();
	}
}

2.呼び出し方法

より実践的な業務処理

            obj = new idg();
            long ret = this.obj.jinit("xxx", 3, 0, 0, "", "", "");
             if (ret == 0) {
    
    
                log.info("初始化成功!");
            } else {
    
    
                log.error("初始化失败");
            }

3. よくある質問

1. ライブラリがロードされると、loadLibrary() メソッドが例外をスローする場合があります。

SecurityException: この例外では、セキュリティ マネージャーが存在する場合、checkLink() メソッドは、メソッドで渡された指定されたライブラリのロードを許可しません。 UnsatisfiedLinkError : この場合、ロードされたライブラリが存在しない場合

NullPointerException: この例外では、ロードされたライブラリが null の場合。

2. 例外処理

SecurityException: これはセキュリティ管理から削除できます。

UnsatisfiedLinkError: これには共有ライブラリ ライブラリを設定する必要があります

解决方案
配置.so文件 让java服务能够load到
1、配置环境变量。   尝试不好使    
	export LD_LIBRARY_PATH=/root/oak/lib/:$LD_LIBRARY_PATH
2、配置共享库    偶尔成功
	 cat /etc/ld.so.conf
	 include ld.so.conf.d/*.conf
	 echo "/root/baller/lib" >> /etc/ld.so.conf
	 ldconfig 刷新的作用
3、java启动添加参数    目前成功100%
 	nohup java -Djava.library.path=/root/oak/lib/ -jar  $APP_NAME > $PRGDIR/log/start.log 2>&1 &

NullPointerException: この例外では、ロードされたライブラリが null の場合。

	解决方案
	1、确定好java的加载类路径正确, 确保初始化代码正确

要約する

全体として、検証で発生したいくつかの問題は、.so ファイル リソースが見つからないこと、および .so リソースに定義されているインターフェイス メソッドが Java 実装クラスの定義と異なることです。結果として生じる問題は、基本的にこれら 2 つの側面から始めることで解決できます。

おすすめ

転載: blog.csdn.net/Oaklkm/article/details/131242132