Android加载库错误 - 无法映射段

QLa*_*nds 2 java-native-interface android android-ndk

我正在使用JNI加载本机库.该库驻留在SD卡上.

我正在使用以下代码加载库:

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);
        }
Run Code Online (Sandbox Code Playgroud)

但是我总是得到:

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上得到了这个

任何想法如何解决这一点非常感谢!!!

谢谢,卡洛斯

oli*_*erg 5

您无法加载本机库或执行位于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 
Run Code Online (Sandbox Code Playgroud)