Android系统。在运行时将库写入lib文件夹

时间:2012-09-10 16:24:07

标签: android

我已经了解到“libs”项目文件夹中的Android应用程序库被写入/ data / data / [package_name] / lib文件夹。在运行时,如果需要,它们将从此位置加载。

我正在写一个出租车司机安卓应用程序。我们决定将其作为一个模块包来执行,如果需要,可以通过互联网进行更新。因此,如果有更新,只需更新所需文件,但不会更新整个apk。这已经有效了!但是我们计划添加地图,以便驾驶员可以在其中一个的帮助下建立一个出租车驱动根,并在屏幕上看到它。

我开始关注适用于Android的Yandex Map Kit。问题是这个工具包有一个本机库(甚至是两个版本的,用于不同的硬件),它在运行时通过System.loadLibrary()加载。我希望这些.so文件也作为模块加载到互联网上,所以我需要一种方法将我的文件写入我的应用程序的/ data / data / [package_name] / lib文件夹。这可能吗?

1 个答案:

答案 0 :(得分:1)

使用此代码:

public class MainActivity extends Activity {
    private final static int FILE_WRITE_BUFFER_SIZE = 32256;
    String[] libraryAssets = {"libmain.so"};
    static MainActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;
        File libs = getApplicationContext().getDir("libs", 0);
        File libMain = new File(libs, libraryAssets[0]);
        File input = new File(Environment.getExternalStorageDirectory(), libraryAssets[0]);
        if(libMain.exists()){
            Log.v("Testing", "exist");
        }else{
            try {
                InputStream is = new BufferedInputStream(new FileInputStream(input), FILE_WRITE_BUFFER_SIZE);
                if(streamToFile(is, libMain)){
                     Log.v("Testing", "File copied");
                }
            } catch (FileNotFoundException e) {
                     Log.v("Testing", e.toString());
            } catch (IOException e) {
                     Log.v("Testing", e.toString());
            }
        Log.v("Testing", libMain.getAbsolutePath());
        }
    }

    private boolean streamToFile(InputStream stm, File outFile) throws IOException{
        byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
        int bytecount;
        OutputStream stmOut = new FileOutputStream(outFile, false);
        while ((bytecount = stm.read(buffer)) > 0){
            stmOut.write(buffer, 0, bytecount);
        }
        stmOut.close();
        stm.close();
        return true;
    }

    public static Context getContext(){
           return instance;
    }
}

在您需要加载库的类中:

private static File libMain = new File(MainActivity.getContext().getDir("libs", 0), "libmain.so");

static{
    try {
        System.load(libMain.getAbsolutePath());
    }catch(Exception e){
        Log.v(Tag, e.toString());
    }catch(UnsatisfiedLinkError e){
        Log.v(Tag, e.toString());
    }
}