Core on Android compiles one more time - improvments in Android builder, code refactoring

git-svn-id: svn://ultimatepp.org/upp/trunk@10567 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
klugier 2016-12-24 14:18:27 +00:00
parent aae3c4a238
commit 61606fd866
11 changed files with 320 additions and 170 deletions

View file

@ -104,26 +104,28 @@ protected:
void AppendModules(String& makeFile) const;
private:
String name;
Vector<String> sourceFiles;
Vector<String> includes;
String name;
Vector<String> sourceFiles;
Index<String> includes;
VectorMap<String, String> cppFlags;
Vector<String> ldLibraries;
Vector<String> staticLibraries;
Vector<String> staticModuleLibraries;
Vector<String> sharedLibraries;
Vector<String> ldLibraries;
Vector<String> staticLibraries;
Vector<String> staticModuleLibraries;
Vector<String> sharedLibraries;
};
class AndroidMakeFile {
public:
static void AppendString(String& makeFile,
const String& variable,
const String& variableName);
static void AppendStringVector(String& makeFile,
const Vector<String>& vec,
const String& variableName,
const String& variablePrefix = "",
const String& variableSuffix = "");
static void AppendString(
String& makeFile,
const String& variable,
const String& variableName);
static void AppendStringVector(
String& makeFile,
const Vector<String>& vec,
const String& variableName,
const String& variablePrefix = "",
const String& variableSuffix = "");
public:
AndroidMakeFile();

View file

@ -1,4 +1,5 @@
#include "Builders.h"
#include "AndroidBuilder.h"
const String AndroidBuilder::RES_PKG_FLAG = "ANDROID_RESOURCES_PACKAGE";
@ -21,11 +22,12 @@ String AndroidBuilder::GetTargetExt() const
return ".apk";
}
bool AndroidBuilder::BuildPackage(const String& package, Vector<String>& linkfile,
Vector<String>& immfile, String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int)
bool AndroidBuilder::BuildPackage(
const String& package, Vector<String>& linkfile,
Vector<String>& immfile, String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int)
{
InitProject();
if(!ValidateBuilderEnviorement())
@ -35,7 +37,7 @@ bool AndroidBuilder::BuildPackage(const String& package, Vector<String>& linkfil
const bool isResourcesPackage = HasFlag(RES_PKG_FLAG);
String uppManifestPath = PackagePath(package);
String packageDir = GetFileFolder(uppManifestPath);
String assemblyDir = GetAssemblyDir(packageDir, package);
String assemblyDir = AndroidBuilderUtils::GetAssemblyDir(packageDir, package);
ChDir(packageDir);
PutVerbose("cd " + packageDir);
@ -209,39 +211,27 @@ bool AndroidBuilder::BuildPackage(const String& package, Vector<String>& linkfil
}
}
AndroidModuleMakeFile pkgMakeFile(NormalizeModuleName(package));
for(int i = 0; i < nativeSourceFilesInPackage.GetCount(); i++)
pkgMakeFile.AddSourceFile(nativeSourceFilesInPackage[i]);
AndroidModuleMakeFileCreator creator(config);
// TODO: Check for path with space?
pkgMakeFile.AddInclude(assemblyDir);
pkgMakeFile.AddInclude(packageDir);
for (int i = 0; i < pkg.uses.GetCount(); i++)
pkgMakeFile.AddInclude(GetAssemblyDir(pkg.uses[i].text));
creator.SetModuleName(NormalizeModuleName(package));
creator.AddSources(nativeSourceFilesInPackage);
creator.AddInclude(assemblyDir);
creator.AddIncludeWithSubdirs(packageDir);
creator.AddIncludes(pkg.uses);
creator.AddFlags(pkg.flag);
creator.AddLdLibraries(pkg.library);
creator.AddStaticModuleLibrary(pkg.static_library);
creator.AddSharedLibraries(pkg.uses);
for(int i = 0; i < pkg.flag.GetCount(); i++)
pkgMakeFile.AddCppFlag(pkg.flag[i].text);
Vector<String> libs = Split(Gather(pkg.library, config.GetKeys()), ' ');
for(int i = 0; i < libs.GetCount(); i++)
pkgMakeFile.AddLdLibrary(libs[i]);
Vector<String> staticLibs = Split(Gather(pkg.static_library, config.GetKeys()), ' ');
for(int i = 0; i < staticLibs.GetCount(); i++)
pkgMakeFile.AddStaticModuleLibrary(staticLibs[i]);
for(int i = 0; i < pkg.uses.GetCount(); i++)
pkgMakeFile.AddSharedLibrary(pkg.uses[i].text);
String pkgMakeFilePath = project.GetJniDir() + DIR_SEPS + package + DIR_SEPS + "Android.mk";
UpdateFile(pkgMakeFilePath, pkgMakeFile.ToString());
UpdateFile(GetModuleMakeFilePath(package), creator.Create());
}
return !error;
}
bool AndroidBuilder::Link(const Vector<String>& linkfile, const String& linkoptions,
bool createmap)
bool AndroidBuilder::Link(
const Vector<String>& linkfile, const String& linkoptions,
bool createmap)
{
InitProject();
if(!ValidateBuilderEnviorement())
@ -343,10 +333,11 @@ bool AndroidBuilder::Link(const Vector<String>& linkfile, const String& linkopti
return true;
}
bool AndroidBuilder::Preprocess(const String& package,
const String& file,
const String& target,
bool asmout)
bool AndroidBuilder::Preprocess(
const String& package,
const String& file,
const String& target,
bool asmout)
{
InitProject();
@ -411,8 +402,9 @@ void AndroidBuilder::ManageProjectCohesion()
DetectAndManageUnusedPackages(project.GetJniDir(), packages);
}
void AndroidBuilder::DetectAndManageUnusedPackages(const String& nest,
const Index<String>& packages)
void AndroidBuilder::DetectAndManageUnusedPackages(
const String& nest,
const Index<String>& packages)
{
for(FindFile ff(AppendFileName(nest, "*")); ff; ff.Next()) {
if(!ff.IsHidden() && ff.IsDirectory()) {
@ -423,10 +415,11 @@ void AndroidBuilder::DetectAndManageUnusedPackages(const String& nest,
}
}
void AndroidBuilder::DeleteUnusedSourceFiles(const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles)
void AndroidBuilder::DeleteUnusedSourceFiles(
const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles)
{
exts.Replace(" ", "");
excludedFiles.Replace(" ", "");
@ -437,28 +430,30 @@ void AndroidBuilder::DeleteUnusedSourceFiles(const String& nest,
dirs.Add(nest);
for(int i = 0; i < dirs.GetCount(); i++) {
for(FindFile ff(AppendFileName(dirs[i], "*")); ff; ff.Next()) {
if(!ff.IsHidden()) {
String path = ff.GetPath();
String name = ff.GetName();
if(ff.IsFolder() && ff.IsSymLink())
dirs.Add(ff.GetPath());
else
if(extsIdx.Find(GetFileExt(path)) == -1)
continue;
else
if(excludedFilesIdx.Find(name) > -1)
continue;
else {
bool exists = false;
for(int j = 0; j < files.GetCount(); j++) {
if(files[j] == path) {
exists = true;
break;
}
if(ff.IsHidden()) {
continue;
}
String path = ff.GetPath();
String name = ff.GetName();
if(ff.IsFolder() && ff.IsSymLink())
dirs.Add(ff.GetPath());
else
if(extsIdx.Find(GetFileExt(path)) == -1)
continue;
else
if(excludedFilesIdx.Find(name) > -1)
continue;
else {
bool exists = false;
for(int j = 0; j < files.GetCount(); j++) {
if(files[j] == path) {
exists = true;
break;
}
if(!exists)
DeleteFile(path);
}
if(!exists)
DeleteFile(path);
}
}
}
@ -825,30 +820,12 @@ String AndroidBuilder::GetSandboxDir() const
return GetFileFolder(target) + DIR_SEPS + "Sandbox" + DIR_SEPS + mainPackageName;
}
String AndroidBuilder::GetAssemblyDir(const String& package)
{
String packageManifest = PackagePath(package);
String packageDir = GetFileFolder(packageManifest);
return GetAssemblyDir(packageDir, package);
}
String AndroidBuilder::GetAssemblyDir(const String& packageDir, const String& package)
{
String assemblyDir = packageDir;
int pos = packageDir.GetCount() - package.GetCount() - 1;
if (pos >= 0 && pos < assemblyDir.GetCount())
assemblyDir.Trim(pos);
return assemblyDir != packageDir ? assemblyDir : "";
}
// -------------------------------------------------------------------
String AndroidBuilder::GetFilePathInAndroidProject(const String& nestDir,
const String& packageName,
const String& fileName) const
String AndroidBuilder::GetFilePathInAndroidProject(
const String& nestDir,
const String& packageName,
const String& fileName) const
{
return nestDir + DIR_SEPS + packageName + DIR_SEPS + RemoveDirNameFromFileName(fileName);
}
@ -867,6 +844,11 @@ String AndroidBuilder::NormalizeModuleName(String moduleName) const
return moduleName;
}
String AndroidBuilder::GetModuleMakeFilePath(const String& package)
{
return project.GetJniDir() + DIR_SEPS + package + DIR_SEPS + "Android.mk";
}
// -------------------------------------------------------------------
Builder *CreateAndroidBuilder()

View file

@ -0,0 +1,47 @@
#ifndef _ide_Builders_AndroidBuilder_h_
#define _ide_Builders_AndroidBuilder_h_
#include "Android.h"
#include <ide/Core/Core.h>
namespace Upp {
class AndroidBuilderUtils final {
public:
AndroidBuilderUtils() = delete;
AndroidBuilderUtils(AndroidBuilderUtils&) = delete;
AndroidBuilderUtils& operator=(AndroidBuilderUtils&) = delete;
~AndroidBuilderUtils() = delete;
static String GetAssemblyDir(const String& package);
static String GetAssemblyDir(const String& packageDir, const String& package);
};
class AndroidModuleMakeFileCreator {
public:
AndroidModuleMakeFileCreator(const Index<String>& builderConfig);
virtual ~AndroidModuleMakeFileCreator() {}
void SetModuleName(const String& name) { makeFile.SetName(name); }
void AddSources(Vector<String>& sources);
void AddInclude(const String& path);
void AddIncludeWithSubdirs(const String& path);
void AddIncludes(const Array<OptItem>& uses);
void AddFlags(const Array<OptItem>& flags);
void AddLdLibraries(const Array<OptItem>& libraries);
void AddStaticModuleLibrary(Array<OptItem>& staticLibraries);
void AddSharedLibraries(const Array<OptItem>& uses);
String Create() { return makeFile.ToString(); }
private:
AndroidModuleMakeFile makeFile;
const Index<String>& config;
};
}
#endif

View file

@ -0,0 +1,24 @@
#include "AndroidBuilder.h"
namespace Upp {
String AndroidBuilderUtils::GetAssemblyDir(const String& package)
{
String packageManifest = PackagePath(package);
String packageDir = GetFileFolder(packageManifest);
return GetAssemblyDir(packageDir, package);
}
String AndroidBuilderUtils::GetAssemblyDir(const String& packageDir, const String& package)
{
String assemblyDir = packageDir;
int pos = packageDir.GetCount() - package.GetCount() - 1;
if (pos >= 0 && pos < assemblyDir.GetCount())
assemblyDir.Trim(pos);
return assemblyDir != packageDir ? assemblyDir : "";
}
}

View file

@ -2,29 +2,33 @@
namespace Upp {
void AndroidMakeFile::AppendString(String& makeFile,
const String& variable,
const String& variableName)
void AndroidMakeFile::AppendString(
String& makeFile,
const String& variable,
const String& variableName)
{
if(!variable.IsEmpty())
makeFile << variableName << " := " << variable << "\n";
}
void AndroidMakeFile::AppendStringVector(String& makeFile,
const Vector<String>& vec,
const String& variableName,
const String& variablePrefix,
const String& variableSuffix)
void AndroidMakeFile::AppendStringVector(
String& makeFile,
const Vector<String>& vec,
const String& variableName,
const String& variablePrefix,
const String& variableSuffix)
{
if(!vec.IsEmpty()) {
makeFile << variableName << " := ";
for(int i = 0; i < vec.GetCount(); i++) {
makeFile << variablePrefix << vec[i] << variableSuffix;
if(i + 1 < vec.GetCount())
makeFile << " ";
}
makeFile << "\n";
if(vec.IsEmpty()) {
return;
}
makeFile << variableName << " := ";
for(int i = 0; i < vec.GetCount(); ++i) {
makeFile << variablePrefix << vec[i] << variableSuffix;
if(i + 1 < vec.GetCount())
makeFile << " ";
}
makeFile << "\n";
}
AndroidMakeFile::AndroidMakeFile()

View file

@ -53,7 +53,7 @@ void AndroidModuleMakeFile::AddSourceFile(const String& path)
void AndroidModuleMakeFile::AddInclude(const String& includePath)
{
includes.Add(includePath);
includes.FindAdd(includePath);
}
void AndroidModuleMakeFile::AddCppFlag(const String& name, const String& value)
@ -93,23 +93,25 @@ void AndroidModuleMakeFile::AppendSourceFiles(String& makeFile) const
void AndroidModuleMakeFile::AppendIncludes(String& makeFile) const
{
AndroidMakeFile::AppendStringVector(makeFile, includes, "LOCAL_C_INCLUDES");
AndroidMakeFile::AppendStringVector(makeFile, includes.GetKeys(), "LOCAL_C_INCLUDES");
}
void AndroidModuleMakeFile::AppendCppFlags(String& makeFile) const
{
if(!cppFlags.IsEmpty()) {
makeFile << "LOCAL_CPPFLAGS := ";
for(int i = 0; i < cppFlags.GetCount(); i++) {
String value = cppFlags[i];
makeFile << "-D" << cppFlags.GetKey(i);
if(!value.IsEmpty())
makeFile << "=" << value;
if(i + 1 < sourceFiles.GetCount())
makeFile << " ";
}
makeFile << "\n";
if(cppFlags.IsEmpty()) {
return;
}
makeFile << "LOCAL_CPPFLAGS := ";
for(int i = 0; i < cppFlags.GetCount(); i++) {
String value = cppFlags[i];
makeFile << "-D" << cppFlags.GetKey(i);
if(!value.IsEmpty())
makeFile << "=" << value;
if(i + 1 < sourceFiles.GetCount())
makeFile << " ";
}
makeFile << "\n";
}
void AndroidModuleMakeFile::AppendLdLibraries(String& makeFile) const

View file

@ -0,0 +1,81 @@
#include "AndroidBuilder.h"
namespace Upp {
AndroidModuleMakeFileCreator::AndroidModuleMakeFileCreator(const Index<String>& builderConfig)
: config(builderConfig)
{
}
void AndroidModuleMakeFileCreator::AddSources(Vector<String>& sources)
{
for(int i = 0; i < sources.GetCount(); ++i) {
makeFile.AddSourceFile(sources[i]);
}
}
void AndroidModuleMakeFileCreator::AddInclude(const String& path)
{
makeFile.AddInclude(path);
}
void AndroidModuleMakeFileCreator::AddIncludeWithSubdirs(const String& path)
{
BiVector<String> dirs { path };
while(!dirs.IsEmpty()) {
for(FindFile ff(AppendFileName(dirs.Head(), "*")); ff; ff.Next()) {
if(ff.IsHidden() || ff.IsSymLink() || !ff.IsFolder()) {
continue;
}
String name = ff.GetName();
if (name.EndsWith(".tpp")) {
continue;
}
dirs.AddTail(ff.GetPath());
}
AddInclude(dirs.Head());
dirs.DropHead();
}
}
void AndroidModuleMakeFileCreator::AddIncludes(const Array<OptItem>& uses)
{
for(int i = 0; i < uses.GetCount(); ++i) {
makeFile.AddInclude(AndroidBuilderUtils::GetAssemblyDir(uses[i].text));
}
}
void AndroidModuleMakeFileCreator::AddFlags(const Array<OptItem>& flags)
{
for(int i = 0; i < flags.GetCount(); ++i) {
makeFile.AddCppFlag(flags[i].text);
}
}
void AndroidModuleMakeFileCreator::AddLdLibraries(const Array<OptItem>& libraries)
{
Vector<String> libs = Split(Gather(libraries, config.GetKeys()), ' ');
for(int i = 0; i < libs.GetCount(); ++i) {
makeFile.AddLdLibrary(libs[i]);
}
}
void AndroidModuleMakeFileCreator::AddStaticModuleLibrary(Array<OptItem>& staticLibraries)
{
Vector<String> slibs = Split(Gather(staticLibraries, config.GetKeys()), ' ');
for(int i = 0; i < slibs.GetCount(); ++i) {
makeFile.AddStaticModuleLibrary(slibs[i]);
}
}
void AndroidModuleMakeFileCreator::AddSharedLibraries(const Array<OptItem>& uses)
{
for(int i = 0; i < uses.GetCount(); i++) {
makeFile.AddSharedLibrary(uses[i].text);
}
}
}

View file

@ -4,7 +4,6 @@
#include <ide/Core/Core.h>
#include <ide/Android/Android.h>
#include <ide/Java/Java.h>
//#include <coff/binobj/binobj.h>
#include <plugin/bz2/bz2.h>
#include "Android.h"
@ -162,9 +161,9 @@ private:
class AndroidBuilder : public Builder {
public:
AndroidSDK androidSDK;
AndroidNDK androidNDK;
Jdk jdk;
AndroidSDK androidSDK;
AndroidNDK androidNDK;
Jdk jdk;
bool ndk_blitz;
Vector<String> ndkArchitectures;
@ -179,29 +178,33 @@ public:
public:
AndroidBuilder();
virtual String GetTargetExt() const;
virtual bool BuildPackage(const String& packageName,
Vector<String>& linkfile,
Vector<String>& immfile,
String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int optimize);
virtual bool Link(const Vector<String>& linkfile, const String& linkoptions, bool createmap);
virtual bool Preprocess(const String& package,
const String& file,
const String& target,
bool asmout);
virtual void CleanPackage(const String& package, const String& outdir);
virtual void AfterClean();
virtual String GetTargetExt() const override;
virtual bool BuildPackage(
const String& packageName,
Vector<String>& linkfile,
Vector<String>& immfile,
String& linkoptions,
const Vector<String>& all_uses,
const Vector<String>& all_libraries,
int optimize) override;
virtual bool Link(
const Vector<String>& linkfile, const String& linkoptions, bool createmap) override;
virtual bool Preprocess(
const String& package,
const String& file,
const String& target,
bool asmout) override;
virtual void CleanPackage(const String& package, const String& outdir) override;
virtual void AfterClean() override;
protected:
void ManageProjectCohesion();
void DetectAndManageUnusedPackages(const String& nest, const Index<String>& packages);
void DeleteUnusedSourceFiles(const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles = "");
void DeleteUnusedSourceFiles(
const String& nest,
const Vector<String>& files,
String exts,
String excludedFiles = "");
bool MovePackageFileToAndroidProject(const String& src, const String& dest);
bool RealizePackageJavaSourcesDirectory(const String& packageName);
bool RealizeLinkDirectories() const;
@ -224,20 +227,20 @@ protected:
bool PreprocessJava(const String& package, const String& file, const String& target);
protected:
String GetFilePathInAndroidProject(const String& nestDir,
const String& packageName,
const String& fileName) const;
String GetFilePathInAndroidProject(
const String& nestDir,
const String& packageName,
const String& fileName) const;
String RemoveDirNameFromFileName(String fileName) const;
String NormalizeModuleName(String moduleName) const;
String GetModuleMakeFilePath(const String& packageName);
private:
void InitProject();
String GetSandboxDir() const;
static String GetAssemblyDir(const String& package);
static String GetAssemblyDir(const String& packageDir, const String& package);
private:
AndroidProject project;
const Workspace& wspc;

View file

@ -25,6 +25,10 @@ file
AndroidApplicationMakeFile.cpp,
AndroidMakeFile.cpp,
AndroidModuleMakeFile.cpp,
"Android Builder" readonly separator,
AndroidBuilder.h,
AndroidBuilderUtils.cpp,
AndroidModuleMakeFileBuilder.cpp,
Components readonly separator,
BuilderComponents.h,
Blitz.cpp,

View file

@ -81,38 +81,38 @@ AndroidBuilderSetup::AndroidBuilderSetup()
{
CtrlLayout(*this);
sdk_path <<= THISBACK(OnSdkPathChange);
sdk_path << [=] { OnSdkPathChange(); };
sdkDownload.SetImage(IdeImg::DownloadBlack());
sdkDownload.Tip("Download");
sdkDownload <<= callback1(LaunchWebBrowser, AndroidSDK::GetDownloadUrl());
sdkDownload << [=] { LaunchWebBrowser(AndroidSDK::GetDownloadUrl()); };
sdk_path.AddFrame(sdkDownload);
sdkBrowse.SetImage(CtrlImg::right_arrow());
sdkBrowse.Tip("Select directory");
sdkBrowse <<= THISBACK(OnSdkPathInsert);
sdkBrowse << [=]{ OnSdkPathInsert(); };
sdk_path.AddFrame(sdkBrowse);
ndk_path <<= THISBACK(OnNdkPathChange);
ndk_path << [=] { OnNdkPathChange(); };
ndkDownload.SetImage(IdeImg::DownloadBlack());
ndkDownload.Tip("Download");
ndkDownload <<= callback1(LaunchWebBrowser, AndroidNDK::GetDownloadUrl());
ndkDownload << [=] { LaunchWebBrowser(AndroidNDK::GetDownloadUrl()); };
ndk_path.AddFrame(ndkDownload);
ndkBrowse.SetImage(CtrlImg::right_arrow());
ndkBrowse.Tip("Select directory");
ndkBrowse <<= THISBACK(OnNdkPathInsert);
ndkBrowse << [=] { OnNdkPathInsert(); };
ndk_path.AddFrame(ndkBrowse);
jdkDownload.SetImage(IdeImg::DownloadBlack());
jdkDownload.Tip("Download");
jdkDownload <<= callback1(LaunchWebBrowser, Jdk::GetDownloadUrl());
jdkDownload << [=] { LaunchWebBrowser(Jdk::GetDownloadUrl()); };
jdk_path.AddFrame(jdkDownload);
jdkBrowse.SetImage(CtrlImg::right_arrow());
jdkBrowse.Tip("Select directory");
jdkBrowse <<= callback1(InsertPath, &jdk_path);
jdkBrowse << [=] { InsertPath(&jdk_path); };
jdk_path.AddFrame(jdkBrowse);
}
@ -256,7 +256,7 @@ void AndroidBuilderSetup::OnNdkPathChange0(const String& ndkPath)
ndk_arch_armeabi.Set(1);
ndk_arch_armeabi_v7a.Set(1);
ndk_arch_arm64_v8a.Set(1);
ndk_common_cpp_options.SetData("-std=c++11 -fexceptions -frtti");
ndk_common_cpp_options.SetData("-std=c++14 -fexceptions -frtti");
}
else
ClearNdkCtrls();
@ -297,9 +297,10 @@ void AndroidBuilderSetup::LoadCppRuntimes(const AndroidNDK& ndk)
LoadDropList(ndk_cpp_runtime, runtimes, ndk.FindDefaultCppRuntime());
}
void AndroidBuilderSetup::LoadDropList(DropList& dropList,
const Vector<String>& values,
const String& defaultKey)
void AndroidBuilderSetup::LoadDropList(
DropList& dropList,
const Vector<String>& values,
const String& defaultKey)
{
dropList.Clear();

View file

@ -211,7 +211,7 @@ LAYOUT(BuildMethodsAndroidBuilderSetupLayout, 648, 500)
ITEM(DropList, sdk_build_tools_release, LeftPosZ(340, 100).TopPosZ(124, 19))
ITEM(LabelBox, dv___12, SetLabel(t_("Android NDK settings")).HSizePosZ(0, 0).TopPosZ(164, 164))
ITEM(StaticText, dv___13, SetText(t_("BLITZ:")).LeftPosZ(8, 116).TopPosZ(180, 19))
ITEM(TextOption, ndk_blitz, SetLabel(t_("&Use BLITZ")).LeftPosZ(128, 112).TopPosZ(180, 20))
ITEM(TextOption, ndk_blitz, SetLabel(t_("&Use BLITZ (Experimental)")).LeftPosZ(128, 232).TopPosZ(180, 20))
ITEM(StaticText, dv___15, SetText(t_("Target architectures:")).LeftPosZ(8, 116).TopPosZ(204, 19))
ITEM(TextOption, ndk_arch_armeabi, SetLabel(t_("armeabi")).LeftPosZ(128, 68).TopPosZ(204, 20))
ITEM(TextOption, ndk_arch_armeabi_v7a, SetLabel(t_("armeabi-v7a")).LeftPosZ(204, 84).TopPosZ(204, 20))