2017-01-17 14 views
0

Мои 32-разрядные приложения для Android ARM поставляются с .so файлами, которые я dlopen() в моем родном коде. Это работает отлично, и я могу их разложить на /data/data/com.domain.app/lib/libX.so.lib/каталог отсутствует после установки 64-битного приложения для Android

Если я добавлю 64-битные двоичные файлы в свой пакет (arm64-v8a) и установлю его на 64-битном Android-устройстве, тогда не будет каталога /data/data/com.domain.app/lib.

После некоторого исследования, я обнаружил, что .so файлы на 64-битном Android устройства в конечном итоге в другом каталоге:

/data/app/com.domain.app-1/lib/arm64

И что еще хуже, «-1» суффикс меняется и может быть «-2» или что-то еще.

Это способ, чтобы проверить, что был установлен в домашней директории приложения:

$ adb shell run-as com.steenriver.biplane '/system/bin/sh -c "pwd"' /data/data/com.steenriver.biplane

$ adb shell run-as com.steenriver.biplane '/system/bin/sh -c "ls -al"' drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 app_.gpg.classloader drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 cache drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 code_cache drwxrwx--x u0_a108 u0_a108 2017-01-17 15:04 files

32-битное устройство будет иметь lib/ запись, перечисленные здесь.

Есть ли какой-либо Android-вызов, который я могу сделать (либо в Java, либо в собственном коде), который скажет мне, где закончились файлы .so, так что я могу dlopen() их?

ответ

0

Для 64-разрядной ARM в библиотечной директории больше нет символической ссылки. Чтобы найти файлы .so, вы можете использовать следующий код Java в OnCreate()

import android.content.pm.PackageInfo; 
import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageManager; 
... 
ApplicationInfo ainfo = this.getApplicationContext().getPackageManager().getApplicationInfo 
( 
    "com.domain.app", 
    PackageManager.GET_SHARED_LIBRARY_FILES 
); 
Log.v(TAG, "native library dir " + ainfo.nativeLibraryDir); 

Сравните это с 32-битным ARM, где предусмотрен символическая:

$ adb shell run-as com.steenriver.littlecrane '/system/bin/sh -c "pwd"' 
/data/data/com.steenriver.littlecrane 
$ adb shell run-as com.steenriver.littlecrane '/system/bin/sh -c "ls -al"' 
drwxrwx--x u0_a109 u0_a109   2017-01-18 11:48 app_.gpg.classloader 
drwxrwx--x u0_a109 u0_a109   2017-01-18 11:26 cache 
drwxrwx--x u0_a109 u0_a109   2017-01-18 11:48 code_cache 
drwxrwx--x u0_a109 u0_a109   2017-01-18 11:47 files 
lrwxrwxrwx root  root    2017-01-18 11:48 lib -> /data/app/com.steenriver.littlecrane-2/lib/arm