cef3lib.cpp 4.3 KB

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