[英]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.