Android 缺少SO库(只有armabi)的解决办法

Android 缺少SO库(只有armabi)的解决办法

前段时间做一个项目,需要引用一些第三方的插件,结果插件只有armabi的so库,而项目中其他依赖除过armabi的库外基本都有(“arm64-v8a”, “armeabi-v7a”, “x86”, “x86_64”),假如放到项目中肯定运行崩溃,所以我用load的方法加载armabi的库文件作为通用库,其他的库文件则让系统选择合适的库文件,毕竟armabi效率不是很好

Usage

JNI native 文件

static{
    String path = FileUtils.checkSoFileExists(DataConfig.context,"libuscasr.so");
    if(path!=null){
        System.load(path);
    }
    DataConfig.context = null;
}

下面是so读取文件,为什么要IO去读取呢?因为我将so库放在了assets下面了,需要拷贝到系统文件夹下面去加载

public static String checkSoFileExists(Context context,String fileName){
    final String path = "/libs/";
    String localPath = context.getFilesDir().getAbsolutePath()+ path;
    File file =new File(localPath + fileName);
    if(!file.exists()){
        //对于经常更换so库的问题,可以添加MD5对比,来更换库文件
        copySoFile(context,localPath,fileName);
        if(!file.exists()){
            return null;
        }else {
            return localPath + fileName;
        }
    }else{
        return localPath + fileName;
    }
}

private static void copySoFile(Context context,String filePath,String fileName){
        final String TAG = "copySoFileTest";
        InputStream inputStream = null;
        FileOutputStream fileOutputStream = null;
        Log.v(TAG, "LazyBandingLib localPath:" + filePath);
        File libsDir = new File(filePath);
        if(!libsDir.exists()){
            //noinspection ResultOfMethodCallIgnored
            libsDir.mkdirs();
        }
        try {
            inputStream = context.getAssets().open(fileName);
            fileOutputStream = new FileOutputStream(filePath+fileName);
            //分配缓冲区的大小
            byte[] bytes = new byte[1024];
            while (inputStream.read(bytes) != -1) {
                fileOutputStream.write(bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(inputStream!=null) {
                    inputStream.close();
                }
                if(fileOutputStream!=null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

好了,这样只有armabi的情况下也能运行起来,注意假如你的项目只有一个库文件依赖,就没必要这样弄了,用loadlibary就搞定了,本文只针对项目中有的依赖有(“arm64-v8a”, “armeabi-v7a”, “x86”, “x86_64”)库,而有的只有armabi的情况

你可能感兴趣的:(心得体会)