安卓App在启动或运行时经常会遇到.so动态库加载失败的情况,其中具体分2种情况:
1.在程序启动时加载失败,这时候就需要用Relinker
去重新加载,可以看我的另外2篇博文:Relinker源码分析、Android安卓本地库加载程序Relinker简单封装
2.在程序运行过程中,已经加载好的.so库被卸载,导致使用的时候找不到符号,这种情况下就要在运行过程中,需要用到库的时候重新去加载
第2种情况主要操作思路是:
来个例子:
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();
}