標籤:
最近公司架構剛移植完成,由於架構程式要調用子程式,每個子程式都是一個so檔案,有好幾百個,把所有的so和apk打包不現實,及時可以升級維護也很麻煩。所以需要放SD卡中。考慮兩種方式
1
放到裝置中的 /data/app-lib/包名/so檔案 (還有一個預設路徑不記得了)程式程式初始化的時候 複製到這個路徑中,loadlibrary時會從兩個預設路徑中載入。
這種方式裝置需要root,效率比較低,如果應用被卸載了所有的so都沒了。
2
直接放到SD卡中 通過dlopen 開啟SD卡中的so 然後dlsym 尋找函數地址
?
| 1234567891011121314151617181920212223242526272829 |
#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); } |
?
找到了函數地址接下來直接執行
比如想調用so中的 myFunc()函數 執行 pf_program()就ok了
結伴旅遊,一個免費的交友網站:www.jieberu.com
推推族,免費得門票,遊景區:www.tuituizu.com
Android NDK載入SD卡中的so