Ошибка загрузки библиотеки Android - не удалось сопоставить сегмент - PullRequest
2 голосов
/ 09 июня 2011

Я загружаю нативную библиотеку, используя JNI.Библиотека находится на SDCard.

Я загружаю библиотеку с этим кодом:

try
        {
            File str;
            String storage;
            str = Environment.getExternalStorageDirectory();
            storage = str.getAbsolutePath();

            File f = new File(storage+"/Android/data/org.ilri.IMPACTLight/libIMPInterface.so");
            if (f.exists())
                System.load(storage+"/Android/data/org.ilri.IMPACTLight/libIMPInterface.so");
        }
        catch (SecurityException e)
        {
            Log.i(QtTAG, "Security: Can't load /mnt/sdcard/Android/data/org.ilri.IMPACTLight/libIMPInterface.so", e);
        }
        catch (UnsatisfiedLinkError e)
        {
            Log.i(QtTAG, "Link: Can't load /mnt/sdcard/Android/data/org.ilri.IMPACTLight/libIMPInterface.so", e);
        }

Однако я всегда получаю:

D / dalvikvm (408): Попытка загрузить lib /mnt/sdcard/Android/data/org.ilri.GPSTest/libGPSInterface.so 0x44ede2c0 I / dalvikvm (408): Невозможно получить dlopen (/mnt/sdcard/Android/data/org.ilri.GPSTest/libGPSInterface.so): Невозможно загрузить библиотеку: load_segments [907]: 33 не удалось сопоставить сегмент из 'libGPSInterface.so' @ 0x81900000 (0x00003470).p_vaddr = 0x00000000 p_offset = 0x00000000

Я получаю это на AVD 2.2

Любая идея, как решить эту проблему очень ценится !!!

Спасибо, Карлос

Ответы [ 2 ]

5 голосов
/ 09 июня 2011

Вы не можете загружать собственные библиотеки или выполнять двоичные файлы, расположенные на SDCard.Он монтируется noexec.

Перед загрузкой необходимо скопировать библиотеку во внутреннее хранилище, то есть в подкаталог из dataDir, например:

PackageManager pm = context.getPackageManager();
String dataDir = pm.getApplicationInfo(context.getPackageName(), 0).dataDir;
// Create a directory like dataDir/mylibs/ and copy the library in it 
1 голос
/ 09 июня 2011

Добавьте ваш .so файл в ваше приложение и используйте следующее ..

System.loadLibrary("libIMPInterface.so");
...