欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android加载指定路径so库文件

程序员文章站 2022-03-29 20:19:34
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initNativeDirectory(getApplic....
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initNativeDirectory(getApplication());
        System.load("/data/data/com.example.myapplication/files/libc++_shared.so");
        System.load("/data/data/com.example.myapplication/files/libaaa.so");

    }
    public static void initNativeDirectory(Application application) {
        if (hasDexClassLoader()) {
            try {
                Log.v("TAG", "create new native dir");
                createNewNativeDir(application);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private static void createNewNativeDir(Context context) throws Exception{
        PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader();
        Object pathList = getPathList(pathClassLoader);
        //获取当前类的属性
        Object nativeLibraryDirectories = pathList.getClass().getDeclaredField("nativeLibraryDirectories");
        ((Field) nativeLibraryDirectories).setAccessible(true);
        //获取 DEXPATHList中的属性值
        ArrayList pathObjects = (ArrayList)((Field) nativeLibraryDirectories).get(pathList);
        Object[] patharr = pathObjects.toArray();
        //添加自定义.so路径
        String mylibpath = "/data/data/com.example.myapplication/files";//context.getFilesDir().getAbsolutePath();

        ArrayList<File> fl = new ArrayList<>();
        fl.add(new File(mylibpath));
        for (int i = 0; i < patharr.length; i++) {
            fl.add(new File(patharr[i].toString()));
        }
        ((Field) nativeLibraryDirectories).set(pathList, fl);
    }
    private static Object getPathList(Object obj) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        return getField(obj, Class.forName("dalvik.system.BaseDexClassLoader"), "pathList");
    }
    private static Object getField(Object obj, Class cls, String str) throws NoSuchFieldException, IllegalAccessException {
        Field declaredField = cls.getDeclaredField(str);
        declaredField.setAccessible(true);
        return declaredField.get(obj);
    }
    /**
     *  仅对4.0以上做支持
     * @return
     */
    private static boolean hasDexClassLoader() {
        try {
            Class.forName("dalvik.system.BaseDexClassLoader");
            return true;
        } catch (ClassNotFoundException var1) {
            return false;
        }
    }

}

 

本文地址:https://blog.csdn.net/weixin_28927079/article/details/107208314