zoukankan      html  css  js  c++  java
  • Android NDK加载SD卡中的so

    最近公司框架刚移植完成,由于框架程序要调用子程序,每个子程序都是一个so文件,有好几百个,把所有的so和apk打包不现实,及时可以升级维护也很麻烦。所以需要放SD卡中。考虑两种方式

    1

    放到设备中的 /data/app-lib/包名/so文件 (还有一个默认路径不记得了)程序程序初始化的时候 复制到这个路径中,loadlibrary时会从两个默认路径中加载。

    这种方式设备需要root,效率比较低,如果应用被卸载了所有的so都没了。

    2

    直接放到SD卡中 通过dlopen 打开SD卡中的so 然后dlsym 查找函数地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include dlfcn.h//dlopen 头文件
    void (*pf_threadcannback)();//声明函数指针类型
    void (*pf_program)();  
    void *handle;
     
    bool getMethod() {
     
        handle = dlopen(//storage//emulated//0//lib//libprogram.so, RTLD_NOW);
        // dlopen(/storage/emulated/0/lib/libtwolib-second.so,RTLD_NOW);
     
        if (!handle) {
            __android_log_print(ANDROID_LOG_INFO, JNIMsg,
                    Your params is null:%s, dlerror());
        } else {
            __android_log_print(ANDROID_LOG_INFO, JNIMsg, Your params is GOOD2);
        }
        pf_program = dlsym(handle, <span font-family:="" font-size:="" line-height:="" style="color:">myFunc</span>);     //指向so中你想要调用的函数名称
        pf_threadcannback = dlsym(handle, ThreadCallBack);
     
        if (dlerror()) {
            __android_log_print(ANDROID_LOG_INFO, JNIMsg, dlsym no error);
            return false;
        }
        return true;
     
        // 释放资源 建议程序退出时调用
        // dlclose(handle);
     
    }
    1
     

    找到了函数地址接下来直接执行

    比如想调用so中的 myFunc()函数 执行 pf_program()就ok了

    结伴旅游,一个免费的交友网站:www.jieberu.com

    推推族,免费得门票,游景区:www.tuituizu.com

  • 相关阅读:
    九九乘法表及双色球
    错误 “SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, ie浏览器兼容问题
    隐藏ie input的X和眼睛图标
    vue-cli解决兼容ie的es6+api问题
    git 本地tag和远程tag对应不上 vscode里pull不下代码
    git 计算commit
    git 查看对比的方法log diff
    git 版本回退方法
    git rebase的使用
    git 常规操作
  • 原文地址:https://www.cnblogs.com/rabbit-bunny/p/4279713.html
Copyright © 2011-2022 走看看