我正在使用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
上得到了这个任何想法如何解决这个问题非常感谢!!!
谢谢, 卡洛斯
答案 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");