2014-01-08 3 views
3

У меня есть приложение для Android, которое хорошо работает на большинстве устройств. Аварии приложения на некоторых устройствах из-заОшибка System.loadLibrary

java.lang.UnsatisfiedLinkError: Couldn't load myjpegjni from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.oso.ono.app-2.apk,libraryPath=/data/data/com.oso.ono/lib]: findLibrary returned null 

Я составил JNI источник для всех архитектур (APP_ABI: = все в Application.mk).

Сбой при попытке загрузить библиотеку с помощью System.loadLibrary ("myjpegjni");

любые идеи?

ответ

0

Либо ваша родная библиотека не находится в /data/data/com.oso.ono/lib, либо она не называется libmyjpegjni.so.

1

Вы сказали, что создали для всех ABI, но, пожалуйста, дважды проверьте, что в папке jniLibs есть все подпапки: armeabi, armeabi-v7a, x86, mips ... или, по крайней мере, у него есть папка с тем же ABI с устройство было разбито.

Если все они существуют, ABI соответствует. Проблема может возникнуть в распаковке lib при установке приложения.

Вы можете попробовать это для ручной распаковки LIB:

public static int loadLibrary(Context context, String library){ 

    try { 
      System.loadLibrary(library); 
      return 0; 
     } catch (UnsatisfiedLinkError ignored) { 
      ignored.printStackTrace(); 
     } 

    File workaroundFile; 
    try { 
     workaroundFile = getWorkaroundLibFile(context, library); 
     if (!workaroundFile.exists()) { 
      unpackLibrary(context, library, workaroundFile); 
     } 
     try { 
      System.load(workaroundFile.getAbsolutePath()); 
      return 1; 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return -1; 
} 

public static File getWorkaroundLibFile(final Context context, final String library) throws PackageManager.NameNotFoundException { 
    final String libName = System.mapLibraryName(library); 
    return new File(context.getDir("my_libs", Context.MODE_PRIVATE), libName); 
} 

@TargetApi(Build.VERSION_CODES.DONUT) 
private static void unpackLibrary(final Context context, final String library, final File outputFile) throws IOException { 
    ZipFile zipFile = null; 
    try { 
     final ApplicationInfo appInfo = context.getApplicationInfo(); 

     zipFile = new ZipFile(new File(appInfo.sourceDir), ZipFile.OPEN_READ); 



     InputStream inputStream = null; 
     FileOutputStream fileOut = null; 
     try { 
      inputStream = getInputStreamFromApk(zipFile, library); 
      fileOut = new FileOutputStream(outputFile); 
      copyStream(inputStream, fileOut); 
     } finally { 
      closeSilently(inputStream); 
      closeSilently(fileOut); 
     } 

     if (Build.VERSION.SDK_INT >= 9) { 
      // Change permission to rwxr-xr-x 
      outputFile.setReadable(true, false); 
      outputFile.setExecutable(true, false); 
      outputFile.setWritable(true); 
     } 
    } finally { 
     try { 
      if (zipFile != null) { 
       zipFile.close(); 
      } 
     } catch (IOException ignored) {} 
    } 
} 

private static void copyStream(InputStream in, OutputStream out) throws IOException { 
    byte[] buf = new byte[4096]; 
    while (true) { 
     int read = in.read(buf); 
     if (read == -1) { 
      break; 
     } 
     out.write(buf, 0, read); 
    } 
} 

private static void closeSilently(final Closeable closeable) { 
    try { 
     if (closeable != null) { 
      closeable.close(); 
     } 
    } catch (IOException ignored) {} 
} 
Смежные вопросы