gpt4 book ai didi

android - 如何将已编译的原生库动态加载到 Android 应用程序中?

转载 作者:行者123 更新时间:2023-12-02 00:53:33 25 4
gpt4 key购买 nike

我正在尝试动态加载 native 库 libhello_world.so进入一个示例 Android 项目。我的目标是应用程序正常运行并在运行时获取库并加载它以便可以使用它。
目前安卓应用的结构是

├── AndroidManifest.xml
├── java
│   └── example
│   └── myapp
│   └── some
│   └── exampleapp
│   ├── Computation.java
│   └── MainActivity.java
├── jniLibs
│   ├── arm64-v8a
│   │   └── libhello_world.so
│   ├── armeabi-v7a
│   │   └── libhello_world.so
│   ├── x86
│   │   └── libhello_world.so
│   └── x86_64
│   └── libhello_world.so
└── res
├── layout
│   └── activity_main.xml
├── mipmap-hdpi
│   ├── ic_launcher.png
│   └── ic_launcher_round.png
├── mipmap-mdpi
│   ├── ic_launcher.png
│   └── ic_launcher_round.png
├── mipmap-xhdpi
│   ├── ic_launcher.png
│   └── ic_launcher_round.png
├── mipmap-xxhdpi
│   ├── ic_launcher.png
│   └── ic_launcher_round.png
├── mipmap-xxxhdpi
│   ├── ic_launcher.png
│   └── ic_launcher_round.png
└── values
├── colors.xml
├── dimens.xml
├── strings.xml
└── styles.xml

我像这样加载库
    static {
System.loadLibrary("hello_world");
}

我现在希望能够以某种方式 没有 显然有文件夹 jniLibs在 android 项目中,从系统中的另一个路径或 URL 加载库。例如,想象一下文件夹 jniLibs 的内容位于目录 /tmp .我将如何在应用程序中指定它以便在运行时找到它?

这可能吗?如果可以,怎么办?

最佳答案

从某种意义上说,你的任务是微不足道的。 Java 定义 System.load()这应该作为

System.load("/tmp/libhello_world.so");

不像 loadLibrary() ,这里明确指定路径,名称不需要以 lib开头并以 .so 结尾.系统仍然可以对加载库的路径施加其他限制。例如。您无法从外部存储加载库,即 /sdcard .只有系统应用程序有权从 /system/libs 加载库(除了少数列入白名单的图书馆)。

但是,正如@CommonsWare 在他的评论中解释的那样,Google Play 商店和其他已建立的应用程序分发 channel 的要求不允许加载库或以其他方式执行不是来自其(Google Play 等)安全 channel 的二进制文件。

至于 jniLinbs文件夹,这不是将 native 库注入(inject) APK 或 bundle 的唯一方法。有多种方法可以强制 gradle 将一些文件添加到 libs部分,以便设备上的应用程序能够使用 System.load() 加载这些内容.

关于android - 如何将已编译的原生库动态加载到 Android 应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com