Android安卓运行时so动态库加载失败问题解决办法

安卓App在启动或运行时经常会遇到.so动态库加载失败的情况,其中具体分2种情况:

1.在程序启动时加载失败,这时候就需要用Relinker去重新加载,可以看我的另外2篇博文:Relinker源码分析Android安卓本地库加载程序Relinker简单封装

2.在程序运行过程中,已经加载好的.so库被卸载,导致使用的时候找不到符号,这种情况下就要在运行过程中,需要用到库的时候重新去加载

第2种情况主要操作思路是:

  • 1.尝试跑native方法
  • 2.捕获异常,如果没有异常说明运行成功
  • 3.如果有异常,那就重新加载.so动态库
  • 4.加载完后重新运行native方法

来个例子🌰:

  • 公共基类:
import android.content.Context;
import com.getkeepsafe.relinker.ReLinker;

public class NativeBaseClass {
    private static Context sContext = null;

    /**
     * 加载动态库方法
     */
    private static void loadLibrary() {
        if (sContext != null) {
            ReLinker.loadLibrary(sContext, "myLibrary");
        } else {
            System.loadLibrary("myLibrary");
        }
    }

    static {
        //在第一次访问这个类时,就会去加载动态库。这段代码只会运行一次
        loadLibrary();
    }

    /**
     * 尝试运行native方法,失败时会重新加载动态库
     * @param runnable 里面包含需要运行的native方法
     */
    public static void tryRunNativeFunction(Runnable runnable) {
        try {
            runnable.run();
        } catch (Throwable e) {
            loadLibrary();
            runnable.run();
        }
    }
}
  • 子类:实际功能方法
public class MyClass extends NativeBaseClass {

	public void func() {
		NativeBaseClass.tryRunNativeFunction(new Runnable() {
            @Override
            public void run() {
                nativeFunc();
            }
        });
	}

	private static native void nativeFunc();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值