Vra

Ek wil derdeparty-JNI biblioteek in runtime laai.
Ek het probeer om direk vanaf sdcard laai. Dit onverwags misluk.
Ek het probeer om biblioteek van sdcard kopieer na / data / data / app / en dan
System.load(/data/data/app/libjni.so)
Dit werk op HTC held, maar versuim op HTC legende met Android 2,1. dit nie tydens uitvoering van inheemse kode en skryf om leersaam stapelspoor meld Enige ander manier om dit te doen? Dis die beste stuk kode, wat werke op 1,5 (HTC Hero), maar donot werke op 2.1 (HTC legende).

FileInputStream fis = new FileInputStream("/sdcard/libjni.so");
File nf = new File("/data/data/app/libjni.so");
FileOutputStream fos = new FileOutputStream(nf);
byte[] buf = new byte[2048];
int n;
while ((n = fis.read(buf)) > 0)
    fos.write(buf, 0, n);
fis.close();
fos.close();
System.load("/data/data/app/libjni.so");
Was dit nuttig?

Oplossing

Android se dinamiese loader kan nie uitvoerbare kode van lêerstelsel die sdcard se laai, omdat dit gemerk nie-uitvoerbare en jy kan nie die kaart uitvoerbare geheue bladsye van nie-uitvoerbare stoor. (In teorie kan jy met die hand te kopieer die inhoud in uitvoerbare anoniem gekarteer bladsye, maar dit is lelik. Weergawes van Android ondersteun programme op SD berg 'n uitvoerbare lêer stelsels soos vervat in 'n lêer op die sdcard, maar 'n derde party app kan nie skryf dié)

Maar wat jy kan doen is om te skryf 'n biblioteek om 'n skryfbare plek in interne stoor - nie die lib gids tot wat jy nie skryf toegang het nie, maar 'n ander een gevind van Context.getDir ( ) of Context.getFilesDir () en dan laai dit met behulp van die volledige pad en SO lêernaam met behulp van System.load () in plaas van System.loadLibrary ().

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top