我已经了解到“libs”项目文件夹中的Android应用程序库被写入/ data / data / [package_name] / lib文件夹。在运行时,如果需要,它们将从此位置加载。
我正在写一个出租车司机安卓应用程序。我们决定将其作为一个模块包来执行,如果需要,可以通过互联网进行更新。因此,如果有更新,只需更新所需文件,但不会更新整个apk。这已经有效了!但是我们计划添加地图,以便驾驶员可以在其中一个的帮助下建立一个出租车驱动根,并在屏幕上看到它。
我开始关注适用于Android的Yandex Map Kit。问题是这个工具包有一个本机库(甚至是两个版本的,用于不同的硬件),它在运行时通过System.loadLibrary()加载。我希望这些.so文件也作为模块加载到互联网上,所以我需要一种方法将我的文件写入我的应用程序的/ data / data / [package_name] / lib文件夹。这可能吗?
答案 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());
}
}