[英]How to use C++ dlopen macro to load a library from C++ code instead from JAVA
我試圖在Android應用程序中使用一些已經編寫的C ++代碼進行服務器通信(基本創建一個客戶端),可悲的是,代碼的邏輯取決於這段代碼:
#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif
該代碼從以下位置調用:
m_hmod = LoadLib(m_namespace::LIBRARY);
其中LIBRARY = "nameofmylib.so"
問題是,當我調用LoadLib時,我的m_var保持為NULL,這意味着它找不到該庫(到目前為止,這是我的猜測),因此我的邏輯進入了錯誤處理而不是連接到套接字。
到目前為止,我一直在瀏覽StackOverflow,並嘗試人們建議的解決方案,包括更改Gradle文件和調整CMakeList.txt,但沒有任何效果。 我也已經調試了幾個小時,甚至嘗試在Android Studio設備文件資源管理器中查找.so位置,以便可以輸入絕對路徑。 但這也沒有結果。
完整的加載流程如下:
#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif
typedef void * hmod;
hmod m_hmod;
m_hmod = LoadLib(m_namespace::LIBRARY);
if (m_hmod) {
... Some code that needs to execute ...
} else {
... What actually happens ...
}
我正在使用的代碼不是我編寫的,但是我必須堅持下去,因此我需要使用其內部的邏輯,而不是重寫並自行編寫。
最有可能的是, m_namespace::LIBRARY
沒有打包到APK中。 為此,您無需檢查設備文件。 Android Studio提供了一個菜單命令來分析您的APK。
如果缺少該庫,則應問自己名稱是否遵循Android規則:它必須以lib開頭,並且必須以.so結尾。 沒有數字后綴,沒有多余的字符,上帝禁止,沒有空格。
如果庫名稱正確,但已由CMake腳本預先構建,則請檢查該庫是否可用於設備的ABI。 同時,確保其路徑在jniLibs.src列表列出的build.gradle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.