2012-09-10 71 views
1

我已經知道「libs」項目文件夾中的Android應用程序庫被寫到/ data/data/[package_name]/lib文件夾中。在運行期間,如果需要,它們將從此位置加載。Android。在運行時將庫文件寫入lib文件夾

我正在寫出租車司機android應用程序。如果需要,我們決定將其作爲通過互聯網進行更新的模塊包來執行。所以如果有更新只需要更新文件但不是整個apk。這已經起作用了!但我們計劃添加地圖,以便司機可以在其中的一個幫助下建立出租車驅動器根目錄並在屏幕上查看它。

我開始在Android上查看Yandex地圖工具包。問題是這個工具包有一個本地庫(甚至是它的兩個版本,用於不同的硬件),它是在運行時通過System.loadLibrary()加載的。我希望這些.so文件作爲模塊也通過互聯網加載,所以我需要一種方法將我的文件寫入我的應用程序的/ data/data/[package_name]/lib文件夾中。那可能嗎?

+0

也許擴展庫是合適的嗎? http://developer.android.com/guide/google/play/expansion-files.html – schwiz

+0

只讀了一些東西。認爲這沒有幫助。 –

+0

你讀過這個問題:http://stackoverflow.com/questions/11582717/android-can-write-to-lib-dir –

回答

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