1 #include "Android.h"
2 
3 namespace Upp {
4 
5 static const String TOOLCHAIN_CLANG = "clang";
6 
GetDownloadUrl()7 String AndroidNDK::GetDownloadUrl()
8 {
9 	return "https://developer.android.com/ndk/downloads/index.html";
10 }
11 
AndroidNDK()12 AndroidNDK::AndroidNDK()
13 {
14 }
15 
AndroidNDK(const String & path)16 AndroidNDK::AndroidNDK(const String& path)
17 {
18 	this->path = path;
19 }
20 
~AndroidNDK()21 AndroidNDK::~AndroidNDK()
22 {
23 }
24 
Validate() const25 bool AndroidNDK::Validate() const
26 {
27 	if(!DirectoryExists(path) || !FileExists(GetNdkBuildPath()))
28 		return false;
29 
30 	return true;
31 }
32 
FindDefaultPlatform() const33 String 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() const44 String 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() const57 String AndroidNDK::FindDefaultCppRuntime() const
58 {
59 	return "c++_shared";
60 }
61 
FindPlatforms() const62 Vector<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() const74 Vector<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() const98 Vector<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() const111 String 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) const122 String 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