android - 缺少创建新 AS 项目并在安装后在我的设备上填充 lib 文件夹的步骤

标签 android android-studio java-native-interface apk

目标

我希望我的 APK 中存在的库在我安装 APK 时可以从固定位置在我的设备上使用。

我打开了another question about this issue基于我现有的项目。这一次,我从头开始了一个全新的项目,以减少未知数并使我的问题更容易解决。

我遵循的步骤

使用 Android Studio 4.0.1,我执行以下操作:

  • 开始一个新的 Android Studio 项目

  • 选择 native C++

  • 设置要测试的项目名

  • 选择 Java 作为语言

  • 使用默认工具链

  • 构建 -> 制作项目

在项目 View 下,我验证我的 app-debug.apk 有一个包含几个子目录的 lib 文件夹,每个子目录至少有 libnative- lib.so 是根据默认的 CMakeLists.txt 规则为此项目构建的。

我希望这个 .so 在我安装 APK 时可以从我的设备访问(我有一个更复杂的项目,我在其中创建 .so 我希望可以从 APK 外部访问)。

但是,当我运行时,从我的项目文件夹中:

c:\Users\xxx\AndroidStudioProjects\test>adb install app\build\outputs\apk\debug\app-debug.apk
Performing Streamed Install
Success

c:\Users\xxx\AndroidStudioProjects\test>adb shell ls /data/data/com.example.test
cache
code_cache

我尝试过的其他改变

以下进一步的更改都不允许我在 /data/data/com.example.test 下看到其他文件

  • android.bundle.enableUncompressedNativeLibs=false 添加到 gradle.properties

  • 已添加

    android {
        ...
        sourceSets.main {
            jniLibs.srcDirs = ['libs']
            jni.srcDirs = []
        }
    

    build.gradle 不要对此做任何改变。

  • 添加 set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)CMakeLists.txt

最佳答案

原生库没有放在/data/data/your.app中但在 /data/app/your.aapp-<key-hash>==/lib/<ABI> ,例如在我的目标上:

hikey960:/ # cd /data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A\=\=/lib/arm64                                                                                     
hikey960:/data/app/com.example.dlopen-6BSPeAN9VvjFlCxIzLHX9A==/lib/arm64 # ls -als
total 1352
   4 drwxr-xr-x 2 system system    4096 2020-11-06 12:43 .
   4 drwxr-xr-x 3 system system    4096 2020-11-06 12:43 ..
1044 -rwxr-xr-x 1 system system 1067256 1981-01-01 01:01 libnative-lib.so
 300 -rwxr-xr-x 1 system system  305360 1981-01-01 01:01 libplugin.so

此外,默认情况下 native 库已存档且无法访问,要提取它们,需要设置 android:extractNativeLibs="true"AndroidManifest.xml (例如这里:https://github.com/nkh-lab/ndk-dlopen/blob/master/dlopen/app/src/main/AndroidManifest.xml)。

关于android - 缺少创建新 AS 项目并在安装后在我的设备上填充 lib 文件夹的步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65683441/

相关文章:

android - Fragments - 指定的 child 已经有一个 parent 。您必须先在 child 的 parent 上调用 removeView()

java - 安卓:位置; Activity 和服务

java - fragment 中的空回收器 View

java - JNI : can't convert jstring to LPCTSTR?

java - JNI FindClass 导入失败

java - 从主线程调用时,对服务的 IPC 调用会导致 NullPointerException,但不会在按钮事件上调用

git - Android Studio (IntelliJ) 空闲时自动 git fetch

android-studio - 新的字符串(字节)在gradle中不起作用

java - JNI指针依赖的设计模式

android - 在 OSMDROID 中的快速覆盖上设置图标