2

「libs」プロジェクト フォルダー内の Android アプリケーション ライブラリが /data/data/[package_name]/lib フォルダーに書き込まれることがわかりました。実行時に、必要に応じてこの場所からロードされます。

私はタクシー運転手のAndroidアプリケーションを書いています。必要に応じてインターネット経由で更新されるモジュールのパッケージとして実行することにしました。したがって、更新がある場合、必要なファイルのみが更新されますが、apk 全体は更新されません。これはすでに機能しています!しかし、マップを追加して、ドライバーがそのうちの 1 つを使用してタクシー ドライブ ルートを構築し、画面で確認できるようにする予定です。

Android用のYandex Map Kitを見始めました。問題は、このキットには、実行時に System.loadLibrary() を介してロードされるネイティブ ライブラリ (異なるハードウェア用の 2 つのバージョンでも) があることです。これらの .so ファイルもモジュールとしてインターネット経由でロードする必要があるため、ファイルをアプリの /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 に答える