簡體   English   中英

如何使用C ++ dlopen宏從C ++代碼而不是從JAVA加載庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM