簡體   English   中英

Android系統。 在運行時將庫寫入lib文件夾

[英]Android. Writing libraries to lib folder at runtime

我了解到“ libs”項目文件夾中的Android應用程序庫已寫入/ data / data / [package_name] / lib文件夾中。 在運行時,如果需要,可以從該位置加載它們。

我正在編寫出租車司機android應用程序。 我們決定將其作為模塊包執行,如果需要,可以通過Internet更新。 因此,如果有更新,則僅更新需要的文件,而不更新整個apk。 這已經有效! 但是我們計划添加地圖,以便駕駛員可以借助其中之一來建立出租車驅動器根目錄,並在屏幕上看到它。

我開始研究適用於Android的Yandex Map Kit。 事實是該工具包具有一個本機庫(對於不同的硬件,它甚至有兩個版本),可以在運行時通過System.loadLibrary()加載。 我也希望這些.so文件也可以作為模塊通過Internet加載,因此我需要一種將文件寫入應用程序的/ data / data / [package_name] / lib文件夾的方法。 那可能嗎?

使用此代碼:

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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM