Developers can use custom app package names in Cangjie applications

Signed-off-by: wentao <wentao18@huawei.com>
This commit is contained in:
wentao 2024-10-12 10:49:43 +08:00
parent a0691142c8
commit ede1dc1e25
6 changed files with 31 additions and 2 deletions

View File

@ -411,6 +411,7 @@ void* CJEnvironment::LoadCJLibrary(const char* dlName)
return nullptr; return nullptr;
} }
isLoadCJLibrary_ = true;
return handle; return handle;
} }
@ -437,9 +438,15 @@ void* CJEnvironment::LoadCJLibrary(OHOS::CJEnvironment::LibraryKind kind, const
LOGE("load cj library failed: %{public}s", DynamicGetError()); LOGE("load cj library failed: %{public}s", DynamicGetError());
return nullptr; return nullptr;
} }
isLoadCJLibrary_ = true;
return handle; return handle;
} }
bool CJEnvironment::CheckLoadCJLibrary()
{
return isLoadCJLibrary_;
}
void CJEnvironment::UnLoadCJLibrary(void* handle) void CJEnvironment::UnLoadCJLibrary(void* handle)
{ {
DynamicFreeLibrary(handle); DynamicFreeLibrary(handle);
@ -516,6 +523,9 @@ CJ_EXPORT extern "C" CJEnvMethods* OHOS_GetCJEnvInstance()
}, },
.setSanitizerKindRuntimeVersion = [](SanitizerKind kind) { .setSanitizerKindRuntimeVersion = [](SanitizerKind kind) {
return CJEnvironment::GetInstance()->SetSanitizerKindRuntimeVersion(kind); return CJEnvironment::GetInstance()->SetSanitizerKindRuntimeVersion(kind);
},
.checkLoadCJLibrary = []() {
return CJEnvironment::GetInstance()->CheckLoadCJLibrary();
} }
}; };
return &gCJEnvMethods; return &gCJEnvMethods;

View File

@ -57,6 +57,7 @@ public:
return isUISchedulerStarted_; return isUISchedulerStarted_;
} }
bool StartUIScheduler(); bool StartUIScheduler();
bool CheckLoadCJLibrary();
void StopUIScheduler(); void StopUIScheduler();
enum LibraryKind { enum LibraryKind {
SYSTEM, SYSTEM,
@ -86,6 +87,7 @@ private:
bool LoadRuntimeApis(); bool LoadRuntimeApis();
static CJRuntimeAPI lazyApis_; static CJRuntimeAPI lazyApis_;
bool isRuntimeStarted_{false}; bool isRuntimeStarted_{false};
bool isLoadCJLibrary_{false};
bool isUISchedulerStarted_{false}; bool isUISchedulerStarted_{false};
void* uiScheduler_ {nullptr}; void* uiScheduler_ {nullptr};
SanitizerKind sanitizerKind_ {SanitizerKind::NONE}; SanitizerKind sanitizerKind_ {SanitizerKind::NONE};

View File

@ -51,6 +51,7 @@ struct CJEnvMethods {
bool (*startDebugger)() = nullptr; bool (*startDebugger)() = nullptr;
void (*registerCJUncaughtExceptionHandler)(const CJUncaughtExceptionInfo& uncaughtExceptionInfo) = nullptr; void (*registerCJUncaughtExceptionHandler)(const CJUncaughtExceptionInfo& uncaughtExceptionInfo) = nullptr;
void (*setSanitizerKindRuntimeVersion)(SanitizerKind kind) = nullptr; void (*setSanitizerKindRuntimeVersion)(SanitizerKind kind) = nullptr;
bool (*checkLoadCJLibrary)() = nullptr;
}; };
class CJEnv { class CJEnv {

View File

@ -1345,7 +1345,9 @@ void MainThread::HandleLaunchApplication(const AppLaunchData &appLaunchData, con
} }
#ifdef CJ_FRONTEND #ifdef CJ_FRONTEND
if (!entryHapModuleInfo.abilityInfos.empty()) { if (!entryHapModuleInfo.abilityInfos.empty()) {
isCJApp = AbilityRuntime::CJRuntime::IsCJAbility(entryHapModuleInfo.abilityInfos.front().srcEntrance); auto srcEntrancenName = entryHapModuleInfo.abilityInfos.front().srcEntrance;
isCJApp = AbilityRuntime::CJRuntime::IsCJAbility(srcEntrancenName);
AbilityRuntime::CJRuntime::SetPackageName(srcEntrancenName);
} }
#endif #endif
moduelJson = entryHapModuleInfo.isModuleJson; moduelJson = entryHapModuleInfo.isModuleJson;

View File

@ -69,6 +69,8 @@ CJEnvMethods* CJEnv::LoadInstance()
} }
AppLibPathVec CJRuntime::appLibPaths_; AppLibPathVec CJRuntime::appLibPaths_;
std::string CJRuntime::packageName_;
std::unique_ptr<CJRuntime> CJRuntime::Create(const Options& options) std::unique_ptr<CJRuntime> CJRuntime::Create(const Options& options)
{ {
auto instance = std::make_unique<CJRuntime>(); auto instance = std::make_unique<CJRuntime>();
@ -152,10 +154,13 @@ bool CJRuntime::LoadCJAppLibrary(const AppLibPathVec& appLibPaths)
return false; return false;
} }
void* handle = nullptr; void* handle = nullptr;
// According to the OHOS rule, the format of the SO name is as follows
auto targetSoName = "lib" + packageName_ + ".so";
for (const auto& libPath : appLibPaths) { for (const auto& libPath : appLibPaths) {
for (auto& itor : std::filesystem::directory_iterator(libPath)) { for (auto& itor : std::filesystem::directory_iterator(libPath)) {
// According to the convention, the names of cj generated products must contain the following keywords // According to the convention, the names of cj generated products must contain the following keywords
if (itor.path().string().find("ohos_app_cangjie") == std::string::npos) { if (itor.path().string().find(targetSoName) == std::string::npos) {
continue; continue;
} }
handle = cjEnv->loadCJLibrary(itor.path().c_str()); handle = cjEnv->loadCJLibrary(itor.path().c_str());
@ -171,6 +176,13 @@ bool CJRuntime::LoadCJAppLibrary(const AppLibPathVec& appLibPaths)
return true; return true;
} }
void CJRuntime::SetPackageName(std::string srcEntryName)
{
// According to the srcEntry rule in the Cangjie application,
// the last '.' The previous strings were all package names
packageName_ = srcEntryName.substr(0, srcEntryName.find_last_of("."));
}
void CJRuntime::SetSanitizerVersion(SanitizerKind kind) void CJRuntime::SetSanitizerVersion(SanitizerKind kind)
{ {
auto cjEnv = OHOS::CJEnv::LoadInstance(); auto cjEnv = OHOS::CJEnv::LoadInstance();

View File

@ -36,6 +36,7 @@ public:
static void SetAppLibPath(const AppLibPathMap& appLibPaths); static void SetAppLibPath(const AppLibPathMap& appLibPaths);
static bool IsCJAbility(const std::string& info); static bool IsCJAbility(const std::string& info);
static void SetSanitizerVersion(SanitizerKind kind); static void SetSanitizerVersion(SanitizerKind kind);
static void SetPackageName(std::string srcEntryName);
~CJRuntime() override = default; ~CJRuntime() override = default;
Language GetLanguage() const override Language GetLanguage() const override
@ -78,6 +79,7 @@ private:
std::string bundleName_; std::string bundleName_;
uint32_t instanceId_ = 0; uint32_t instanceId_ = 0;
static AppLibPathVec appLibPaths_; static AppLibPathVec appLibPaths_;
static std::string packageName_;
}; };
} // namespace AbilityRuntime } // namespace AbilityRuntime
} // namespace OHOS } // namespace OHOS