2

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

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

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

4

1 回答 1

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());
    }
}
于 2013-09-25T09:18:07.013 回答