コード例 #1
0
        public static int GetMinimumApiLevelFor(AndroidTargetArch arch, string androidNdkPath)
        {
            var minValue  = NdkUtil.IsNdk64BitArch(arch) ? 21 : arch == AndroidTargetArch.Arm ? 4 : 9;
            var platforms = GetSupportedPlatforms(androidNdkPath).OrderBy(x => x).Where(x => x >= minValue);

            return(platforms.First(x => Directory.Exists(Path.Combine(androidNdkPath, "platforms", $"android-{x}", $"arch-{archPathMap[arch]}"))));
        }
コード例 #2
0
        static string GetNdkToolchainPrefix(AndroidTargetArch arch)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return("arm-linux-androideabi-");

            case AndroidTargetArch.Arm64:
                return("aarch64-linux-android-");

            case AndroidTargetArch.X86:
                return("i686-linux-android-");

            case AndroidTargetArch.X86_64:
                return("x86_64-linux-android-");

            case AndroidTargetArch.Mips:
                return("mipsel-linux-android-");

            default:
                // return empty. Since this method returns the "prefix", the resulting
                // tool path just becomes the tool name i.e. "gcc" becomes "gcc".
                // This should work for any custom arbitrary platform.
                return(String.Empty);
            }
        }
コード例 #3
0
        static string[] GetNdkToolchainDirectories(string toolchainsPath, AndroidTargetArch arch)
        {
            if (!Directory.Exists(toolchainsPath))
            {
                throw new Exception($"Missing Android NDK toolchains directory '{toolchainsPath}'. Please install the Android NDK.");
            }
            if (string.Compare(Path.GetFileName(toolchainsPath), "llvm", StringComparison.OrdinalIgnoreCase) == 0)
            {
                return(new[] { toolchainsPath });
            }
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return(Directory.GetDirectories(toolchainsPath, "arm-linux-androideabi-*"));

            case AndroidTargetArch.Arm64:
                return(Directory.GetDirectories(toolchainsPath, "aarch64-linux-android-*"));

            case AndroidTargetArch.X86:
                return(Directory.GetDirectories(toolchainsPath, "x86-*"));

            case AndroidTargetArch.X86_64:
                return(Directory.GetDirectories(toolchainsPath, "x86_64-*"));

            case AndroidTargetArch.Mips:
                return(Directory.GetDirectories(toolchainsPath, "mipsel-linux-android-*"));

            default:     // match any directory that contains the arch name.
                return(Directory.GetDirectories(toolchainsPath, "*" + arch + "*"));
            }
        }
コード例 #4
0
ファイル: NdkUtils.cs プロジェクト: pjcollins/xamarin-android
        public static string GetNdkPlatformLibPath(string androidNdkPath, AndroidTargetArch arch, int apiLevel)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkPlatformLibPath(androidNdkPath, arch, apiLevel));
            }

            var    checkedPaths = new List <string> ();
            string lib          = arch == AndroidTargetArch.X86_64 ? "lib64" : "lib";
            string path         = Path.Combine(androidNdkPath, "platforms", $"android-{apiLevel}", $"arch-{GetPlatformArch (arch)}", "usr", lib);

            if (!Directory.Exists(path))
            {
                checkedPaths.Add(path);
                path = Path.Combine(GetNdk22OrNewerSysrootDir(androidNdkPath), GetArchDirName(arch), apiLevel.ToString());
            }

            if (!Directory.Exists(path))
            {
                checkedPaths.Add(path);
                string paths = String.Join("; ", checkedPaths);
                throw new InvalidOperationException($"Platform library directory for target {arch} and API Level {apiLevel} was not found. Checked paths: {paths}");
            }
            return(path);
        }
コード例 #5
0
        public static string GetNdkTool(string androidNdkPath, AndroidTargetArch arch, string tool)
        {
            var           toolchains = GetNdkToolchainPath(androidNdkPath, arch);
            string        extension  = OS.IsWindows ? ".exe" : string.Empty;
            List <string> toolPaths  = null;

            foreach (var platbase in toolchains)
            {
                string path = Path.Combine(platbase, "prebuilt", MonoAndroidHelper.AndroidSdk.AndroidNdkHostPlatform, "bin", GetNdkToolchainPrefix(arch) + tool + extension);
                if (File.Exists(path))
                {
                    return(path);
                }
                if (toolPaths == null)
                {
                    toolPaths = new List <string>();
                }
                toolPaths.Add(path);
            }
            {
                string path = Path.Combine(androidNdkPath, "prebuilt", MonoAndroidHelper.AndroidSdk.AndroidNdkHostPlatform, "bin", tool);
                if (File.Exists(path))
                {
                    return(path);
                }
                if (toolPaths == null)
                {
                    toolPaths = new List <string>();
                }
                toolPaths.Add(path);
            }

            Diagnostic.Error(5101, Properties.Resources.XA5101_C_Compiler, arch, string.Join("; ", toolPaths));
            return(null);
        }
コード例 #6
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetNdkToolchainPrefix(AndroidTargetArch arch, bool forCompiler)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkToolchainPrefix(arch));
            }

            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return(forCompiler ? "armv7a-linux-androideabi" : "arm-linux-androideabi");

            case AndroidTargetArch.Arm64:
                return("aarch64-linux-android");

            case AndroidTargetArch.X86:
                return("i686-linux-android");

            case AndroidTargetArch.X86_64:
                return("x86_64-linux-android");

            default:
                // return empty. Since this method returns the "prefix", the resulting
                // tool path just becomes the tool name i.e. "gcc" becomes "gcc".
                // This should work for any custom arbitrary platform.
                return(String.Empty);
            }
        }
コード例 #7
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 public static string GetNdkPlatformLibPath(string androidNdkPath, AndroidTargetArch arch, int level)
 {
     string path = Path.Combine (androidNdkPath, "platforms", "android-" + level, "arch-" + GetPlatformArch (arch), "usr", "lib");
     if (!Directory.Exists (path))
         throw new InvalidOperationException (String.Format ("Platform library directory for target {0} and API Level {1} was not found. Expected path is \"{2}\"", arch, level, path));
     return path;
 }
コード例 #8
0
        static string[] GetNdkToolchainDirectories(string toolchainsPath, AndroidTargetArch arch)
        {
            if (!Directory.Exists(toolchainsPath))
            {
                Diagnostic.Error(5101,
                                 "Missing Android NDK toolchains directory '{0}'. Please install the Android NDK.",
                                 toolchainsPath);
            }
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return(Directory.GetDirectories(toolchainsPath, "arm-linux-androideabi-*"));

            case AndroidTargetArch.Arm64:
                return(Directory.GetDirectories(toolchainsPath, "aarch64-linux-android-*"));

            case AndroidTargetArch.X86:
                return(Directory.GetDirectories(toolchainsPath, "x86-*"));

            case AndroidTargetArch.X86_64:
                return(Directory.GetDirectories(toolchainsPath, "x86_64-*"));

            case AndroidTargetArch.Mips:
                return(Directory.GetDirectories(toolchainsPath, "mipsel-linux-android-*"));

            default:             // match any directory that contains the arch name.
                return(Directory.GetDirectories(toolchainsPath, "*" + arch + "*"));
            }
        }
コード例 #9
0
        public static string GetNdkToolPrefix(string androidNdkPath, AndroidTargetArch arch)
        {
            var path = GetNdkTool(androidNdkPath, arch, "as");

            if (path != null)
            {
                path = path.Substring(0, path.LastIndexOf("-") + 1);
            }
            return(path);
        }
コード例 #10
0
ファイル: Aot.cs プロジェクト: BODYsuperman/xamarin-android
        static bool ValidateAotConfiguration(TaskLoggingHelper log, AndroidTargetArch arch, bool enableLLVM)
        {
            if (arch == AndroidTargetArch.X86_64)
            {
                log.LogCodedError("XA3004", "x86_64 architecture is not currently supported on AOT mode.");
                return(false);
            }

            return(true);
        }
コード例 #11
0
        public static string GetNdkPlatformIncludePath(string androidNdkPath, AndroidTargetArch arch, int level)
        {
            string path = Path.Combine(androidNdkPath, "platforms", "android-" + level, "arch-" + GetPlatformArch(arch), "usr", "include");

            if (!Directory.Exists(path))
            {
                throw new InvalidOperationException(String.Format("Platform header files for target {0} and API Level {1} was not found. Expected path is \"{2}\"", arch, level, path));
            }
            return(path);
        }
コード例 #12
0
        public static string GetNdkPlatformLibPath(string androidNdkPath, AndroidTargetArch arch, int level)
        {
            string lib  = arch == AndroidTargetArch.X86_64 ? "lib64" : "lib";
            string path = Path.Combine(androidNdkPath, "platforms", "android-" + level, "arch-" + GetPlatformArch(arch), "usr", lib);

            if (!Directory.Exists(path))
            {
                throw new InvalidOperationException(String.Format("Platform library directory for target {0} and API Level {1} was not found. Expected path is \"{2}\"", arch, level, path));
            }
            return(path);
        }
コード例 #13
0
ファイル: GdbPaths.cs プロジェクト: yudhitech/xamarin-android
 public static string GetAbiFromArch(AndroidTargetArch arch)
 {
     switch (arch) {
     case AndroidTargetArch.Arm:   return "android-arm";
     case AndroidTargetArch.Arm64: return "android-arm64";
     case AndroidTargetArch.Mips:  return "android-mips";
     case AndroidTargetArch.X86:   return "android-x86";
     case AndroidTargetArch.X86_64: return "android-x86_64";
     }
     return null;
 }
コード例 #14
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetNdkAsmIncludePath(string androidNdkPath, AndroidTargetArch arch, int apiLevel)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkAsmIncludePath(androidNdkPath, arch, apiLevel));
            }

            string path    = GetUnifiedHeadersPath(androidNdkPath);
            string archDir = GetArchDirName(arch);

            return(Path.Combine(path, archDir));
        }
コード例 #15
0
        static int GetNdkApiLevel(string androidNdkPath, string androidApiLevel, AndroidTargetArch arch)
        {
            int level = int.Parse(androidApiLevel);

            // Some Android API levels do not exist on the NDK level. Workaround this my mapping them to the
            // most appropriate API level that does exist.
            if (level == 6 || level == 7)
            {
                level = 5;
            }
            else if (level == 10)
            {
                level = 9;
            }
            else if (level == 11)
            {
                level = 12;
            }
            else if (level == 20)
            {
                level = 19;
            }
            else if (level == 22)
            {
                level = 21;
            }
            else if (level == 23)
            {
                level = 21;
            }

            // API levels below level 21 do not provide support for 64-bit architectures.
            if (NdkUtil.IsNdk64BitArch(arch) && level < 21)
            {
                level = 21;
            }

            // We perform a downwards API level lookup search since we might not have hardcoded the correct API
            // mapping above and we do not want to crash needlessly.
            for (; level >= 5; level--)
            {
                try {
                    NdkUtil.GetNdkPlatformLibPath(androidNdkPath, arch, level);
                    break;
                } catch (InvalidOperationException ex) {
                    // Path not found, continue searching...
                    continue;
                }
            }

            return(level);
        }
コード例 #16
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
        public static List<string> GetNdkToolchainPath(string androidNdkPath, AndroidTargetArch arch)
        {
            var toolchains  = GetNdkToolchainDirectories (Path.Combine (androidNdkPath, "toolchains"), arch);
            if (!toolchains.Any ())
                Diagnostic.Error (5101,
                        "Toolchain directory for target {0} was not found.",
                        arch);
            // Sort the toolchains paths in reverse so that we prefer the latest versions.
            Array.Sort(toolchains);
            Array.Reverse(toolchains);

            return new List<string>(toolchains);
        }
コード例 #17
0
        public static List <string> GetNdkToolchainPath(string androidNdkPath, AndroidTargetArch arch)
        {
            var toolchains = GetNdkToolchainDirectories(Path.Combine(androidNdkPath, "toolchains"), arch);

            if (!toolchains.Any())
            {
                Diagnostic.Error(5101, Properties.Resources.XA5101_Toolchain, arch);
            }
            // Sort the toolchains paths in reverse so that we prefer the latest versions.
            Array.Sort(toolchains);
            Array.Reverse(toolchains);

            return(new List <string>(toolchains));
        }
コード例 #18
0
ファイル: NdkUtils.cs プロジェクト: matthid/Embeddinator-4000
        public static string GetNdkClangBin(string toolchainsPath, AndroidTargetArch arch)
        {
            var toolChainDir = GetNdkToolchainDirectories(toolchainsPath, arch).First();
            var machineDir   = Directory.GetDirectories(Path.Combine(toolChainDir, "prebuilt")).First();

            var gcc = Path.Combine(machineDir, "bin", GetNdkToolchainPrefix(arch) + "gcc");

            if (File.Exists(gcc))
            {
                return(gcc);
            }

            throw new Exception($"Unable to find NDK toolchain for {arch}!");
        }
コード例 #19
0
        public static List <string> GetNdkToolchainPath(string androidNdkPath, AndroidTargetArch arch)
        {
            var toolchains = GetNdkToolchainDirectories(Path.Combine(androidNdkPath, "toolchains"), arch);

            if (!toolchains.Any())
            {
                throw new Exception($"Toolchain directory for target {arch} was not found.");
            }
            // Sort the toolchains paths in reverse so that we prefer the latest versions.
            Array.Sort(toolchains);
            Array.Reverse(toolchains);

            return(new List <string>(toolchains));
        }
コード例 #20
0
        static string GetMonoDroidArchName(AndroidTargetArch arch)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return("armeabi");

            case AndroidTargetArch.Mips:
                return("mips");

            case AndroidTargetArch.X86:
                return("x86");
            }
            return(null);
        }
コード例 #21
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetNdkToolPrefix(string androidNdkPath, AndroidTargetArch arch, int apiLevel)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkToolPrefix(androidNdkPath, arch));
            }

            var path = GetNdkTool(androidNdkPath, arch, "as", apiLevel);

            if (path != null)
            {
                path = path.Substring(0, path.LastIndexOf("-") + 1);
            }
            return(path);
        }
コード例 #22
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetNdkPlatformLibPath(string androidNdkPath, AndroidTargetArch arch, int apiLevel)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkPlatformLibPath(androidNdkPath, arch, apiLevel));
            }

            string lib  = arch == AndroidTargetArch.X86_64 ? "lib64" : "lib";
            string path = Path.Combine(androidNdkPath, "platforms", $"android-{apiLevel}", $"arch-{GetPlatformArch (arch)}", "usr", lib);

            if (!Directory.Exists(path))
            {
                throw new InvalidOperationException($"Platform library directory for target {arch} and API Level {apiLevel} was not found. Expected path is \"{path}\"");
            }
            return(path);
        }
コード例 #23
0
ファイル: GdbPaths.cs プロジェクト: yudhitech/xamarin-android
        public static string GetDebugServerPath(AndroidDebugServer server, AndroidTargetArch arch,
            string AndroidNdkDirectory, string SdkBinDirectory)
        {
            switch (server)
            {
            case AndroidDebugServer.Gdb:
                var abi  = GetAbiFromArch (arch);
                return Path.Combine (AndroidNdkDirectory, "prebuilt", abi, "gdbserver", "gdbserver");
            case AndroidDebugServer.Ds2:
                return Path.Combine (SdkBinDirectory, "ds2-" + arch.ToString ().ToLowerInvariant ());
            case AndroidDebugServer.Llgs:
                throw new NotImplementedException ();
            }

            return null;
        }
コード例 #24
0
        public static string GetAbiFromArch(AndroidTargetArch arch)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:   return("android-arm");

            case AndroidTargetArch.Arm64: return("android-arm64");

            case AndroidTargetArch.Mips:  return("android-mips");

            case AndroidTargetArch.X86:   return("android-x86");

            case AndroidTargetArch.X86_64: return("android-x86_64");
            }
            return(null);
        }
コード例 #25
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetNdkPlatformIncludePath(string androidNdkPath, AndroidTargetArch arch, int apiLevel)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetNdkPlatformIncludePath(androidNdkPath, arch, apiLevel));
            }

            string path = GetUnifiedHeadersPath(androidNdkPath);

            if (Directory.Exists(path))
            {
                return(path);
            }

            throw new InvalidOperationException($"Android include path not found. Tried: {path}");
        }
コード例 #26
0
        public static string GetNdkAsmIncludePath(string androidNdkPath, AndroidTargetArch arch, int level)
        {
            string path = GetPerPlatformHeadersPath(androidNdkPath, arch, level);

            if (Directory.Exists(path))
            {
                return(null);
            }

            path = GetUnifiedHeadersPath(androidNdkPath);
            if (!Directory.Exists(path))
            {
                return(null);
            }

            string archDir = null;

            switch (arch)
            {
            case AndroidTargetArch.Arm:
                archDir = "arm-linux-androideabi";
                break;

            case AndroidTargetArch.Arm64:
                archDir = "aarch64-linux-android";
                break;

            case AndroidTargetArch.Mips:
                archDir = "mipsel-linux-android";
                break;

            case AndroidTargetArch.X86:
                archDir = "i686-linux-android";
                break;

            case AndroidTargetArch.X86_64:
                archDir = "x86_64-linux-android";
                break;
            }

            if (archDir == null)
            {
                return(null);
            }

            return(Path.Combine(path, archDir));
        }
コード例 #27
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static int GetMinimumApiLevelFor(AndroidTargetArch arch, string androidNdkPath)
        {
            if (!UsingClangNDK)
            {
                return(NdkUtilOld.GetMinimumApiLevelFor(arch, androidNdkPath));
            }

            int    minValue = 0;
            string archName = GetPlatformArch(arch);

            if (!XABuildConfig.ArchAPILevels.TryGetValue(archName, out minValue))
            {
                throw new InvalidOperationException($"Unable to determine minimum API level for architecture {arch}");
            }

            return(minValue);
        }
コード例 #28
0
        public static string GetDebugServerPath(AndroidDebugServer server, AndroidTargetArch arch,
                                                string AndroidNdkDirectory, string SdkBinDirectory)
        {
            switch (server)
            {
            case AndroidDebugServer.Gdb:
                var abi = GetAbiFromArch(arch);
                return(Path.Combine(AndroidNdkDirectory, "prebuilt", abi, "gdbserver", "gdbserver"));

            case AndroidDebugServer.Ds2:
                return(Path.Combine(SdkBinDirectory, "ds2-" + arch.ToString().ToLowerInvariant()));

            case AndroidDebugServer.Llgs:
                throw new NotImplementedException();
            }

            return(null);
        }
コード例 #29
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 public static string GetNdkTool(string androidNdkPath, AndroidTargetArch arch, string tool)
 {
     var toolchains = GetNdkToolchainPath(androidNdkPath, arch);
     string extension = OS.IsWindows ? ".exe" : string.Empty;
     List<string> toolPaths  = null;
     foreach (var platbase in toolchains) {
         string path = Path.Combine (platbase, "prebuilt", AndroidSdk.AndroidNdkHostPlatform, "bin", GetNdkToolchainPrefix (arch) + tool + extension);
         if (File.Exists (path))
             return path;
         if (toolPaths == null)
             toolPaths = new List<string>();
         toolPaths.Add (path);
     }
     Diagnostic.Error (5101,
             "C compiler for target {0} was not found. Tried paths: \"{1}\"",
             arch, string.Join ("; ", toolPaths));
     return null;
 }
コード例 #30
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        // See the "NDK r19 bug" comment in the "GetNdkTool" method below for explanation of the issue
        // this method fixes.
        public static string GetCompilerTargetParameters(string androidNdkPath, AndroidTargetArch arch, int apiLevel, bool forCPlusPlus = false)
        {
            if (!UsingClangNDK || !OS.IsWindows)
            {
                return(String.Empty);
            }

            string targetPrefix;
            string otherParams = String.Empty;

            switch (arch)
            {
            case AndroidTargetArch.Arm:
                targetPrefix = "--target=armv7a-linux-androideabi";
                break;

            case AndroidTargetArch.Arm64:
                targetPrefix = "--target=aarch64-linux-android";
                break;

            case AndroidTargetArch.X86:
                targetPrefix = "--target=i686-linux-android";
                otherParams  = "-mstackrealign";
                break;

            case AndroidTargetArch.X86_64:
                targetPrefix = "--target=x86_64-linux-android";
                break;

            default:
                throw new InvalidOperationException($"Unsupported target architecture {arch}");
            }

            string stdlib = String.Empty;

            if (forCPlusPlus)
            {
                stdlib = "-stdlib=libc++";
            }

            return($"{targetPrefix}{apiLevel} {otherParams} -fno-addrsig {stdlib}");
        }
コード例 #31
0
        public static string GetNdkPlatformIncludePath(string androidNdkPath, AndroidTargetArch arch, int level)
        {
            // This is for NDK older than r16 which isn't configured to use unified headers. We
            string path = GetPerPlatformHeadersPath(androidNdkPath, arch, level);

            if (!Directory.Exists(path))
            {
                // This is for NDK r15 (if configured to use unified headers) or NDK r16+ (which doesn't have
                // the per-platform includes anymore)
                path = GetUnifiedHeadersPath(androidNdkPath);
                if (Directory.Exists(path))
                {
                    return(path);
                }

                throw new InvalidOperationException(String.Format("Platform header files for target {0} and API Level {1} was not found. Expected path is \"{2}\"", arch, level, path));
            }

            return(path);
        }
コード例 #32
0
        public static string GetLlvmToolchainTarget(AndroidTargetArch arch, int apiLevel)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return($"armv7a-linux-androideabi{apiLevel}");

            case AndroidTargetArch.Arm64:
                return($"aarch64-linux-android{apiLevel}");

            case AndroidTargetArch.X86:
                return($"i686-linux-android{apiLevel}");

            case AndroidTargetArch.X86_64:
                return($"x86_64-linux-android{apiLevel}");

            default:
                return(string.Empty);
            }
        }
コード例 #33
0
        public static string GetNdkPlatformIncludePath(string androidNdkPath, AndroidTargetArch arch, int level, bool isLLVM)
        {
            string path;

            if (isLLVM)
            {
                var toolchainDir = Path.Combine(androidNdkPath, "toolchains", "llvm", "prebuilt");
                var machineDir   = Directory.GetDirectories(Path.Combine(toolchainDir)).First();
                path = Path.Combine(machineDir, "sysroot");
            }
            else
            {
                path = Path.Combine(androidNdkPath, "platforms", "android-" + level, "arch-" + GetPlatformArch(arch));
            }
            if (!Directory.Exists(path))
            {
                throw new InvalidOperationException(String.Format("Platform header files for target {0} and API Level {1} was not found. Expected path is \"{2}\"", arch, level, path));
            }
            return(path);
        }
コード例 #34
0
ファイル: NdkUtils.cs プロジェクト: eerhardt/xamarin-android
        public static string GetArchDirName(AndroidTargetArch arch)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return("arm-linux-androideabi");

            case AndroidTargetArch.Arm64:
                return("aarch64-linux-android");

            case AndroidTargetArch.X86:
                return("i686-linux-android");

            case AndroidTargetArch.X86_64:
                return("x86_64-linux-android");

            default:
                throw new InvalidOperationException($"Unsupported architecture {arch}");
            }
        }
コード例 #35
0
        static string GetPlatformArch(AndroidTargetArch arch)
        {
            switch (arch)
            {
            case AndroidTargetArch.Arm:
                return("arm");

            case AndroidTargetArch.Arm64:
                return("arm64");

            case AndroidTargetArch.Mips:
                return("mips");

            case AndroidTargetArch.X86:
                return("x86");

            case AndroidTargetArch.X86_64:
                return("x86_64");
            }
            return(null);
        }
コード例 #36
0
ファイル: Aot.cs プロジェクト: yudhitech/xamarin-android
        static int GetNdkApiLevel(string androidNdkPath, string androidApiLevel, AndroidTargetArch arch)
        {
            int level = int.Parse(androidApiLevel);
            // Some Android API levels do not exist on the NDK level. Workaround this my mapping them to the
            // most appropriate API level that does exist.
            if (level == 6 || level == 7) level = 5;
            else if (level == 10) level = 9;
            else if (level == 11) level = 12;
            else if (level == 20) level = 19;
            else if (level == 22) level = 21;
            else if (level == 23) level = 21;

            // API levels below level 21 do not provide support for 64-bit architectures.
            if (NdkUtil.IsNdk64BitArch(arch) && level < 21) {
                level = 21;
            }

            // We perform a downwards API level lookup search since we might not have hardcoded the correct API
            // mapping above and we do not want to crash needlessly.
            for (; level >= 5; level--) {
                try {
                    NdkUtil.GetNdkPlatformLibPath (androidNdkPath, arch, level);
                    break;
                } catch (InvalidOperationException ex) {
                    // Path not found, continue searching...
                    continue;
                }
            }

            return level;
        }
コード例 #37
0
 static string GetMonoDroidArchName(AndroidTargetArch arch)
 {
     switch (arch) {
     case AndroidTargetArch.Arm:
         return "armeabi";
     case AndroidTargetArch.Mips:
         return "mips";
     case AndroidTargetArch.X86:
         return "x86";
     }
     return null;
 }
コード例 #38
0
 public string GetPlatformNativeLibPath(AndroidTargetArch arch)
 {
     return FindPlatformNativeLibPath (SdkPath, GetMonoDroidArchName (arch));
 }
コード例 #39
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
        public static bool ValidateNdkPlatform(TaskLoggingHelper log, string ndkPath, AndroidTargetArch arch, bool requireLibm)
        {
            // Check that we have a compatible NDK version for the targeted ABIs.
            NdkUtil.NdkVersion ndkVersion;
            bool hasNdkVersion = NdkUtil.GetNdkToolchainRelease (ndkPath, out ndkVersion);

            if (NdkUtil.IsNdk64BitArch(arch) && hasNdkVersion && ndkVersion.Version < 10) {
                log.LogMessage (MessageImportance.High,
                        "The detected Android NDK version is incompatible with the targeted 64-bit architecture, " +
                        "please upgrade to NDK r10 or newer.");
            }

            // NDK r10d is buggy and cannot link x86_64 ABI shared libraries because they are 32-bits.
            // See https://code.google.com/p/android/issues/detail?id=161421
            if (requireLibm && ndkVersion.Version == 10 && ndkVersion.Revision == "d" && arch == AndroidTargetArch.X86_64) {
                log.LogCodedError ("XA3004", "Android NDK r10d is buggy and provides an incompatible x86_64 libm.so. " +
                        "See https://code.google.com/p/android/issues/detail?id=161422.");
                return false;
            }

            return true;
        }
コード例 #40
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 static string[] GetNdkToolchainDirectories(string toolchainsPath, AndroidTargetArch arch)
 {
     if (!Directory.Exists (toolchainsPath))
         Diagnostic.Error (5101,
                 "Missing Android NDK toolchains directory '{0}'. Please install the Android NDK.",
                 toolchainsPath);
     switch (arch) {
     case AndroidTargetArch.Arm:
         return Directory.GetDirectories (toolchainsPath, "arm-linux-androideabi-*");
     case AndroidTargetArch.Arm64:
         return Directory.GetDirectories (toolchainsPath, "aarch64-linux-android-*");
     case AndroidTargetArch.X86:
         return Directory.GetDirectories (toolchainsPath, "x86-*");
     case AndroidTargetArch.X86_64:
         return Directory.GetDirectories (toolchainsPath, "x86_64-*");
     case AndroidTargetArch.Mips:
         return Directory.GetDirectories (toolchainsPath, "mipsel-linux-android-*");
     default: // match any directory that contains the arch name.
         return Directory.GetDirectories (toolchainsPath, "*" + arch + "*");
     }
 }
コード例 #41
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 static string GetNdkToolchainPrefix(AndroidTargetArch arch)
 {
     switch (arch) {
     case AndroidTargetArch.Arm:
         return "arm-linux-androideabi-";
     case AndroidTargetArch.Arm64:
         return "aarch64-linux-android-";
     case AndroidTargetArch.X86:
         return "i686-linux-android-";
     case AndroidTargetArch.X86_64:
         return "x86_64-linux-android-";
     case AndroidTargetArch.Mips:
         return "mipsel-linux-android-";
     default:
         // return empty. Since this method returns the "prefix", the resulting
         // tool path just becomes the tool name i.e. "gcc" becomes "gcc".
         // This should work for any custom arbitrary platform.
         return String.Empty;
     }
 }
コード例 #42
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 static string GetPlatformArch(AndroidTargetArch arch)
 {
     switch (arch) {
     case AndroidTargetArch.Arm:
         return "arm";
     case AndroidTargetArch.Arm64:
         return "arm64";
     case AndroidTargetArch.Mips:
         return "mips";
     case AndroidTargetArch.X86:
         return "x86";
     case AndroidTargetArch.X86_64:
         return "x86_64";
     }
     return null;
 }
コード例 #43
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 public static string GetNdkToolPrefix(string androidNdkPath, AndroidTargetArch arch)
 {
     var path = GetNdkTool (androidNdkPath, arch, "as");
     if (path != null)
         path = path.Substring (0, path.LastIndexOf ("-") + 1);
     return path;
 }
コード例 #44
0
ファイル: NdkUtils.cs プロジェクト: yudhitech/xamarin-android
 public static bool IsNdk64BitArch(AndroidTargetArch arch)
 {
     return arch == AndroidTargetArch.Arm64 || arch == AndroidTargetArch.X86_64;
 }
コード例 #45
0
ファイル: Aot.cs プロジェクト: yudhitech/xamarin-android
        static bool ValidateAotConfiguration(TaskLoggingHelper log, AndroidTargetArch arch, bool enableLLVM)
        {
            if (arch == AndroidTargetArch.Arm64 && enableLLVM) {
                log.LogCodedError ("XA3004", "arm64-v8a architecture is not currently supported on LLVM AOT mode.");
                return false;
            }

            if (arch == AndroidTargetArch.X86_64) {
                log.LogCodedError ("XA3004", "x86_64 architecture is not currently supported on AOT mode.");
                return false;
            }

            return true;
        }