1 #include "Android.h" 2 3 namespace Upp { 4 5 static const String TOOLCHAIN_CLANG = "clang"; 6 GetDownloadUrl()7String AndroidNDK::GetDownloadUrl() 8 { 9 return "https://developer.android.com/ndk/downloads/index.html"; 10 } 11 AndroidNDK()12AndroidNDK::AndroidNDK() 13 { 14 } 15 AndroidNDK(const String & path)16AndroidNDK::AndroidNDK(const String& path) 17 { 18 this->path = path; 19 } 20 ~AndroidNDK()21AndroidNDK::~AndroidNDK() 22 { 23 } 24 Validate() const25bool AndroidNDK::Validate() const 26 { 27 if(!DirectoryExists(path) || !FileExists(GetNdkBuildPath())) 28 return false; 29 30 return true; 31 } 32 FindDefaultPlatform() const33String AndroidNDK::FindDefaultPlatform() const 34 { 35 Vector<String> platforms = FindPlatforms(); 36 37 Android::NormalizeVersions(platforms); 38 Sort(platforms, StdGreater<String>()); 39 Android::RemoveVersionsNormalization(platforms); 40 41 return !platforms.IsEmpty() ? platforms[0] : ""; 42 } 43 FindDefaultToolchain() const44String AndroidNDK::FindDefaultToolchain() const 45 { 46 Index<String> toolchains(FindToolchains()); 47 48 int clangIdx = toolchains.Find(TOOLCHAIN_CLANG); 49 if (clangIdx >= 0) { 50 return toolchains[clangIdx]; 51 } 52 53 SortIndex(toolchains, StdGreater<String>()); 54 return !toolchains.IsEmpty() ? toolchains[toolchains.GetCount()] : ""; 55 } 56 FindDefaultCppRuntime() const57String AndroidNDK::FindDefaultCppRuntime() const 58 { 59 return "c++_shared"; 60 } 61 FindPlatforms() const62Vector<String> AndroidNDK::FindPlatforms() const 63 { 64 Vector<String> platforms; 65 66 for(FindFile ff(AppendFileName(GetPlatformsDir(), "*")); ff; ff.Next()) { 67 if(!ff.IsHidden() && ff.IsFolder()) 68 platforms.Add(ff.GetName()); 69 } 70 71 return platforms; 72 } 73 FindToolchains() const74Vector<String> AndroidNDK::FindToolchains() const 75 { 76 Vector<String> toolchains; 77 78 for(FindFile ff(AppendFileName(GetToolchainsDir(), "*")); ff; ff.Next()) { 79 if(!ff.IsHidden() && ff.IsFolder()) { 80 String name = ff.GetName(); 81 if(name.StartsWith("llvm")) { 82 toolchains.Add(TOOLCHAIN_CLANG); 83 continue; 84 } 85 86 Vector<String> nameParts = Split(name, "-"); 87 if(nameParts.GetCount() > 1) { 88 String toolchain = nameParts[nameParts.GetCount() - 1]; 89 if(FindIndex(toolchains, toolchain) == -1) 90 toolchains.Add(toolchain); 91 } 92 } 93 } 94 95 return toolchains; 96 } 97 FindCppRuntimes() const98Vector<String> AndroidNDK::FindCppRuntimes() const 99 { 100 Vector<String> runtimes; 101 102 // Values from NDK documentation 103 runtimes.Add("c++_static"); 104 runtimes.Add("c++_shared"); 105 runtimes.Add("system"); 106 runtimes.Add("none"); 107 108 return runtimes; 109 } 110 GetIncludeDir() const111String AndroidNDK::GetIncludeDir() const 112 { 113 String dir; 114 dir << GetPlatformsDir() << DIR_SEPS << FindDefaultPlatform() << DIR_SEPS; 115 // TODO: decide how to implement architecture selection. 116 dir << "arch-arm" << DIR_SEPS; 117 dir << "usr" << DIR_SEPS << "include"; 118 119 return DirectoryExists(dir) ? dir : ""; 120 } 121 GetCppIncludeDir(const String & cppRuntime) const122String AndroidNDK::GetCppIncludeDir(const String& cppRuntime) const 123 { 124 String nest = GetSourcesDir() + DIR_SEPS + "cxx-stl" + DIR_SEPS; 125 if(cppRuntime == "system") { 126 return nest + "system" + DIR_SEPS + "include"; 127 } 128 else 129 if(cppRuntime.StartsWith("c++")) { 130 return nest + "llvm-libc++" + DIR_SEPS + "include"; 131 } 132 133 return ""; 134 } 135 136 } 137