Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android NDK加載SD卡中的so

Android NDK加載SD卡中的so

編輯:關於Android編程

最近公司框架剛移植完成,由於框架程序要調用子程序,每個子程序都是一個so文件,有好幾百個,把所有的so和apk打包不現實,及時可以升級維護也很麻煩。所以需要放SD卡中。考慮兩種方式

1

放到設備中的 /data/app-lib/包名/so文件 (還有一個默認路徑不記得了)程序程序初始化的時候 復制到這個路徑中,loadlibrary時會從兩個默認路徑中加載。

這種方式設備需要root,效率比較低,如果應用被卸載了所有的so都沒了。

2

直接放到SD卡中 通過dlopen 打開SD卡中的so 然後dlsym 查找函數地址

#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, myFunc);     //指向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了

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved