指定在 Android 上安装时从 .apk 中提取 .so 的位置(即目标路径)

Posted

技术标签:

【中文标题】指定在 Android 上安装时从 .apk 中提取 .so 的位置(即目标路径)【英文标题】:Specify where a .so is to be extracted from .apk (i.e. destination path) when installing on Android 【发布时间】:2015-10-20 03:00:09 【问题描述】:

我有一个 needs to be installed in a subdirectory named sqldrivers.so 文件。

所以我需要将其安装到/data/app-lib/org.example.qt.untitled/sqldrivers/libqslite.so,而不是将其安装到/data/app-lib/org.example.qt.untitled/libqslite.so

我正在使用带有 ADT 的 Eclipse,当我想添加一个原生库时,我将它放在 libs\<ARCH>,即模拟器的 libs\x86

所以我尝试将它放在C:\Workspace\untitled\libs\x86\sqldrivers\libqslite.so 中,但它根本没有添加到 .apk 中。

如何指定 .so 文件应从手机上的 .apk 中提取的位置?

【问题讨论】:

【参考方案1】:

似乎实现此目的的唯一方法是在应用程序的第一次运行时将文件从 /data/app-lib 复制到其他目录。

所以我只是在我的应用程序的开头添加了一些代码,以将 .so 文件从 /data/app-lib/<app> 复制到 /data/data/<app>/qt_plugins/sqldrivers(如果该文件不存在)。

File sourceFile = new File(context.getApplicationInfo().nativeLibraryDir + "/libplugins_sqldrivers_libqsqlite.so");
File libPath = new File(context.getApplicationInfo().dataDir + "/qt_plugins");
File destinationDir = new File(libPath + "/sqldrivers");
File destinationFile = new File(destinationDir + "/libqsqlite.so");
if (!destinationFile.exists()) 
    destinationDir.mkdirs();
    try 
        copy(sourceFile, destinationFile);
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

【讨论】:

以上是关于指定在 Android 上安装时从 .apk 中提取 .so 的位置(即目标路径)的主要内容,如果未能解决你的问题,请参考以下文章

我用android studio创建一个TV项目,打包成apk 后 安装出现如下错误是怎么回事?

Android : 添加apk私有权限

如何扫描Android APK依赖的Jar包中哪些文件包含指定字符

如何在Android上安装apk软件

在没有市场的 Android 上安装 APK 应用程序

怎么通过adb将apk安装到指定设备上