springboot项目调用xxx.so文件常见问题

# 项目场景:springboot项目调用xxx.so文件常见问题


前言

本章节主要介绍:java项目需要使用System.loadLibrary(“xxx”)来调用.so的类库,在集成过程中国遇到的问题以及问题的处理。

一、loadLibrary()是什么?

loadLibrary()方法用于使用名为library_name(library name)的给定参数作为在该方法中传递的参数来加载库,一个Java文件包含我们需要使用loadLibrary()方法加载该库的本机代码。在此方法中,以特定于系统的方式完成了从library_name到给定文件名的映射。在类加载和实例化时,也将加载本机方法所需的已实现本机代码

二、加载.so文件实例

1.代码载入

首先要有一个libidg_java.so的文件,
package 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("初始化失败");
            }

三、常见问题

1.在库加载时,loadLibrary()方法可能会引发异常

SecurityException:在此异常中,checkLink()当安全管理器存在时,其方法不允许加载在方法中传递的指定库
UnsatisfiedLinkError:在这种情况下,如果加载的库不存在。
NullPointerException:在此异常中,如果加载的库为null。

2.异常处理

SecurityException:这个去掉安全管理即可

UnsatisfiedLinkError:这个需要配置共享lib库

解决方案
配置.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实现类定义的有出入。导致的问题,遇到问题从这两方面入手基本可以解决。

猜你喜欢

转载自blog.csdn.net/Oaklkm/article/details/131242132