我的32位ARM Android应用程序带有我在我的本机代码中执行的.so文件。这很好用,我可以在/data/data/com.domain.app/lib/libX.so
位置进行操作。
如果我将64位二进制文件添加到我的软件包(arm64-v8a)并将其安装在64位Android设备上,则不会出现/data/data/com.domain.app/lib
目录。
经过一番调查后,我发现64位Android设备上的.so文件最终位于不同的目录中:
/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 :(得分:1)
对于64位ARM,不再对库目录建立符号链接。要查找.so文件,可以在onCreate()
中使用以下Java代码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