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();
}

你可能感兴趣的:(Android,ndk,android,安卓)