Android 设置动态库依赖路径

在 Android 中,使用 dlopen 打开动态库时,可以通过以下方法设置动态库的依赖路径

LD_LIBRARY_PATH

在调用 dlopen 之前,使用 setenv 设置 LD_LIBRARY_PATH 环境变量

cpp 复制代码
#include <jni.h>
#include <cstdlib> // For setenv
#include <dlfcn.h> // For dlopen

extern "C" JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_loadLibrary(JNIEnv *env, jobject /* this */) {
    //将 LD_LIBRARY_PATH 设置为包含你的动态库的路径。1 表示如果环境变量已存在,则覆盖它
    setenv("LD_LIBRARY_PATH", "/path/to/your/libs", 1);

    // 打开动态库
    void* handle = dlopen("libmylibrary.so", RTLD_NOW);
    if (!handle) {
        // 处理错误
        const char* error = dlerror();
        // 打印或处理错误信息
    }

    // 关闭动态库
    dlclose(handle);
}

link_directories 和 target_link_directories 是两个不同的命令,用于设置库的搜索路径

link_directories 用于添加目录到链接器的搜索路径。这意味着链接器在链接时会在这些目录中查找库文件

cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加库的搜索路径
link_directories(/path/to/your/libs)

add_executable(my_executable main.cpp)
target_link_libraries(my_executable mylibrary)

link_directories 会影响所有后续的目标(target),而不仅仅是某一个特定的目标

target_link_directories 是 CMake 3.13 引入的新命令,允许你为特定的目标设置库的搜索路径。这提供了更细粒度的控制,使你可以指定特定目标的链接库目录,而不影响其他目标

cpp 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

add_executable(my_executable main.cpp)

# 为特定目标设置库的搜索路径
target_link_directories(my_executable PRIVATE /path/to/your/libs)

target_link_libraries(my_executable mylibrary)
  • PRIVATE 表示库路径仅对目标自身有效
  • PUBLIC 表示库路径对目标自身和其依赖目标有效
  • INTERFACE 表示库路径仅对依赖该目标的其他目标有效。
  1. link_directories: 使用这种方法时,所有后续的目标都可以看到添加的库路径。这种方法简单,但可能会导致不必要的路径冲突,特别是在大型项目中
  2. target_link_directories: 推荐在较新版本的 CMake 中使用,它提供了更好的封装性和灵活性。你可以为不同的目标设置不同的库路径,避免路径冲突,并且提高了构建脚本的可维护性
相关推荐
杉氧32 分钟前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
朝与同歌暮同酒1 小时前
冒泡社区《幻想三国》还能玩吗?安卓手机与电脑模拟器试玩记录
android·智能手机·电脑
音视频牛哥2 小时前
从数字孪生到机器人操控:Android Unity3D下RTMP/RTSP多路低延迟播放实践
android·unity·音视频·unity rtsp播放器·unity rtmp播放器·rtsp player·rtmp player
用户69371750013843 小时前
了解一下 Agent Harness
android·前端·后端
淡淡的香烟3 小时前
Android15适配16kb完整版
android
杉氧3 小时前
跨平台持久化:Flutter 本地数据库的多线程安全与架构设计实践
android·前端·flutter
小孔龙4 小时前
Compose 布局与绘制:LayoutNode、DisplayList 与 GraphicsLayer
android·android jetpack
淡淡的香烟4 小时前
Android常用adb命令
android·adb
李白你好4 小时前
强大的 Frida 重打包工具,用于 iOS 和 Android。轻松修改 Frida 特征
android·ios
超爱西西鸭4 小时前
鸿蒙企业级CI/CD高级工程化搭建:自动化构建流水线/多环境配置/自动化测试集成/签名打包发布
android·学习·ci/cd·华为·自动化·harmonyos·鸿蒙