cef3lib.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright aXiuShen. All Rights Reserved.
  2. #include "cef3lib.h"
  3. #include "GenericPlatform/GenericPlatformProcess.h"
  4. #include "GenericPlatform/GenericPlatformMisc.h"
  5. #if defined CEF_WINDOWS
  6. #include "Windows/WindowsPlatformProcess.h"
  7. #include "Windows/WindowsPlatformMisc.h"
  8. #elif defined CEF_LINUX
  9. #include "Linux/LinuxPlatformProcess.h"
  10. #include "Linux/LinuxPlatformMisc.h"
  11. #elif defined CEF_MAC
  12. #include "Mac/MacPlatformProcess.h"
  13. #include "Mac/MacPlatformMisc.h"
  14. #endif
  15. #include "HAL/FileManager.h"
  16. #include "Misc/Paths.h"
  17. #include "CoreWebLog.h"
  18. #include <string>
  19. #include <stdlib.h>
  20. // WEB_CORE_API
  21. //
  22. //#if defined CEF_WINDOWS
  23. //#define CEFLIB_EXPORT __declspec(dllimport)
  24. //#elif defined CEF_LINUX
  25. //#define CEFLIB_EXPORT
  26. //#endif
  27. //#ifdef __cplusplus
  28. //extern "C" {
  29. //#endif
  30. // CEFLIB_EXPORT const char* cef_api_hash(int entry);
  31. //#ifdef __cplusplus
  32. //}
  33. //#endif
  34. //
  35. //void CefEnableHighDPISupport();
  36. #if defined CEF_MAC
  37. # include "include/wrapper/cef_library_loader.h"
  38. #endif
  39. // WEB_CORE_API
  40. #ifdef WEBVIEW_CUSTOMIZED_CORE
  41. class CEF3LIB: public ICEF3LIB {
  42. public:
  43. void LoadCEF3Modules() ;
  44. void UnloadCEF3Modules() ;
  45. int Branch();
  46. FString LibPath() ;
  47. virtual ~CEF3LIB() = default;
  48. private:
  49. void* LoadDllCEF(const FString& Path);
  50. private:
  51. std::vector<void*> dllHand;
  52. #if defined CEF_MAC
  53. CefScopedLibraryLoader CEFLibraryLoader;
  54. #endif
  55. };
  56. ICEF3LIB* ICEF3LIB::get() {
  57. static ICEF3LIB* install= nullptr;
  58. //UE_LOG(WebViewLog, Error, TEXT("CEF3DLL::get"));
  59. if (nullptr == install) {
  60. install = new CEF3LIB();
  61. }
  62. return install;
  63. }
  64. int CEF3LIB::Branch() {
  65. return CEF3_BRANCH;
  66. }
  67. void* CEF3LIB::LoadDllCEF(const FString& Path)
  68. {
  69. if (Path.IsEmpty())
  70. {
  71. return nullptr;
  72. }
  73. void* Handle = FPlatformProcess::GetDllHandle(*Path);
  74. if (!Handle)
  75. {
  76. int32 ErrorNum = FPlatformMisc::GetLastError();
  77. TCHAR ErrorMsg[1024];
  78. FPlatformMisc::GetSystemErrorMessage(ErrorMsg, 1024, ErrorNum);
  79. UE_LOG(WebViewLog, Fatal, TEXT("Failed to get CEF3 DLL handle for %s: %s (%d)"), *Path, ErrorMsg, ErrorNum);
  80. }
  81. else {
  82. dllHand.push_back(Handle);
  83. }
  84. return Handle;
  85. }
  86. FString CEF3LIB::LibPath() {
  87. TSharedPtr<IPlugin> Plugin = IPluginManager::Get().FindPlugin(TEXT("CefBase"));
  88. if (!Plugin.IsValid()) {
  89. Plugin = IPluginManager::Get().FindPlugin(TEXT("WebView"));
  90. }
  91. const FString BaseDir = FPaths::ConvertRelativePathToFull(Plugin->GetBaseDir());
  92. FString LibPath;
  93. #if defined CEF_WINDOWS
  94. LibPath = FPaths::Combine(*BaseDir, TEXT("Source/ThirdParty/cefForUe"), TEXT(CEF3_VERSION), TEXT("win64/lib"));
  95. #elif defined CEF_MAC
  96. LibPath = FPaths::Combine(*BaseDir, TEXT("Source/ThirdParty/cefForUe"), TEXT(CEF3_VERSION), TEXT("mac/lib"));
  97. #elif defined CEF_LINUX
  98. LibPath = FPaths::Combine(*BaseDir, TEXT("Source/ThirdParty/cefForUe"), TEXT(CEF3_VERSION), TEXT("linux/lib"));
  99. #endif
  100. return LibPath;
  101. }
  102. void CEF3LIB::LoadCEF3Modules()
  103. {
  104. if (dllHand.size())return;// has load
  105. //UE_LOG(WebViewLog, Error, TEXT("CEF3DLL::LoadCEF3Modules"));
  106. FString libPath = LibPath();
  107. #if defined CEF_WINDOWS
  108. FString envPath = FPlatformMisc::GetEnvironmentVariable(TEXT("Path")) + TEXT(";") + libPath;
  109. FPlatformMisc::SetEnvironmentVar(TEXT("Path"), *envPath);
  110. FPlatformProcess::PushDllDirectory(*libPath);
  111. if (LoadDllCEF(FPaths::Combine(*libPath, TEXT("chrome_elf.dll")))) {
  112. LoadDllCEF(FPaths::Combine(*libPath, TEXT("libcef.dll")));
  113. }
  114. FPlatformProcess::PopDllDirectory(*libPath);
  115. #elif defined CEF_MAC
  116. FString envPath = FPlatformMisc::GetEnvironmentVariable(TEXT("LD_LIBRARY_PATH")) + TEXT(":") + libPath;
  117. FPlatformMisc::SetEnvironmentVar(TEXT("LD_LIBRARY_PATH"), *envPath);
  118. FString frameWorks = FPaths::Combine(*libPath, TEXT("Chromium Embedded Framework.framework"), TEXT("Chromium Embedded Framework"));
  119. if (!cef_load_library(TCHAR_TO_ANSI(*frameWorks))) {
  120. UE_LOG(LogTemp, Error, TEXT("Chromium loader initialization failed"));
  121. }
  122. #elif defined CEF_LINUX
  123. FString envPath = FPlatformMisc::GetEnvironmentVariable(TEXT("LD_LIBRARY_PATH")) + TEXT(":") + libPath;
  124. FString cmd = FString::Printf(TEXT("chmod 775 \"%s/*\""), *libPath);
  125. system(TCHAR_TO_UTF8(*cmd));
  126. FPlatformMisc::SetEnvironmentVar(TEXT("LD_LIBRARY_PATH"), *envPath);
  127. FPlatformProcess::PushDllDirectory(*libPath);
  128. LoadDllCEF(FPaths::Combine(*libPath, TEXT("libcef.so")));
  129. FPlatformProcess::PopDllDirectory(*libPath);
  130. #endif
  131. }
  132. void CEF3LIB::UnloadCEF3Modules()
  133. {
  134. for (auto it = dllHand.rbegin(); it != dllHand.rend(); it++) {
  135. FPlatformProcess::FreeDllHandle(*it);
  136. }
  137. dllHand.clear();
  138. }
  139. #endif