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

时间:2011-06-09 10:01:01

标签: android java-native-interface 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);
        }

然而,我总是得到:

  

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 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

在您的应用程序中添加.so文件并使用以下内容..

System.loadLibrary("libIMPInterface.so");