[Android] [PATCH] LibVlcUtil: fix library path search
Jean-Baptiste Kempf
jb at videolan.org
Wed Oct 22 15:53:18 CEST 2014
LGTM.
On 22 Oct, Thomas Guillem wrote :
> After android-21, libs are not necessarily in applicationInfo.dataDir + "/lib"
> folder, so use applicationInfo.nativeLibraryDir (added after Gingerbread).
>
> Also fix system library path search by using
> System.getProperty("java.library.path") that return "/vendor/lib:/system/lib"
> or "/vendor/lib64:/system/lib64".
> ---
> .../src/org/videolan/libvlc/LibVlcUtil.java | 49 ++++++++++++++++------
> 1 file changed, 37 insertions(+), 12 deletions(-)
>
> diff --git a/vlc-android/src/org/videolan/libvlc/LibVlcUtil.java b/vlc-android/src/org/videolan/libvlc/LibVlcUtil.java
> index a4bed55..739c06a 100644
> --- a/vlc-android/src/org/videolan/libvlc/LibVlcUtil.java
> +++ b/vlc-android/src/org/videolan/libvlc/LibVlcUtil.java
> @@ -100,13 +100,11 @@ public class LibVlcUtil {
> // If already checked return cached result
> if(errorMsg != null || isCompatible) return isCompatible;
>
> - ApplicationInfo applicationInfo = context.getApplicationInfo();
> - String libBasePath;
> - if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
> - libBasePath = "/system";
> - else
> - libBasePath = applicationInfo.dataDir;
> - ElfData elf = readLib(libBasePath + "/lib/libvlcjni.so");
> + final File lib = searchLibrary(context);
> + if (lib == null)
> + return true;
> +
> + ElfData elf = readLib(lib);
> if(elf == null) {
> Log.e(TAG, "WARNING: Unable to read libvlcjni.so; cannot check device ABI!");
> Log.e(TAG, "WARNING: Cannot guarantee correct ABI for this build (may crash)!");
> @@ -320,17 +318,44 @@ public class LibVlcUtil {
> boolean att_fpu;
> }
>
> + private static File searchLibrary(Context context) {
> + // Search for library path
> + String [] libraryPaths = null;
> + final ApplicationInfo applicationInfo = context.getApplicationInfo();
> +
> + if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
> + final String property = System.getProperty("java.library.path");
> + libraryPaths = property.split(":");
> + } else {
> + libraryPaths = new String[1];
> + if (isGingerbreadOrLater())
> + libraryPaths[0] = applicationInfo.nativeLibraryDir;
> + else
> + libraryPaths[0] = applicationInfo.dataDir + "/lib";
> + }
> + if (libraryPaths == null) {
> + Log.e(TAG, "can't find library path");
> + return null;
> + }
> +
> + // Search for libvlcjni.so
> + File lib = null;
> + for (String libraryPath : libraryPaths) {
> + lib = new File(libraryPath, "libvlcjni.so");
> + if (lib.exists() && lib.canRead())
> + return lib;;
> + }
> + Log.e(TAG, "WARNING: Can't find shared library");
> + return null;
> + }
> +
> /** '*' prefix means it's unsupported */
> private static String[] CPU_archs = {"*Pre-v4", "*v4", "*v4T",
> "v5T", "v5TE", "v5TEJ",
> "v6", "v6KZ", "v6T2", "v6K", "v7",
> "*v6-M", "*v6S-M", "*v7E-M", "*v8"};
>
> - private static ElfData readLib(String path) {
> - File file = new File(path);
> - if (!file.exists() || !file.canRead())
> - return null;
> -
> + private static ElfData readLib(File file) {
> RandomAccessFile in = null;
> try {
> in = new RandomAccessFile(file, "r");
> --
> 2.1.0
>
> _______________________________________________
> Android mailing list
> Android at videolan.org
> https://mailman.videolan.org/listinfo/android
--
With my kindest regards,
--
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device
More information about the Android
mailing list