Подробно объясним как исправить ту или иную ошибку самым простым способом
Fatal error lnk1104 не удается открыть файл kernel32 lib
Hi All
Remove From My Forums
Question
Hi All
OK so i know there is A LOT on this error floating around. I am a complete newb to VS 2008. i’ve just done a complete install of Visual Studio 2008 on Xp32 SP2 etc, with the view of using it as a simple compiler for now, and moving onto building app later.
Having created a new empty project, added a .cpp file and created the simplest of simple Hello world applications i get the following linking error:
I’ve not touched or configured anything to get this error. Since this i have been googling like mad, and most replies just say «check your linker settings» etc. But there is nothing there. I’ve tried adding multiple different paths to the linker dependancies and the VC++ DIrectories and nothing
On my system, the only Kernel32.lib is located at: C:Program FilesMicrosoft SDKsWindowsv5.0LibIA64
But surely this is for 64 bit platforms? Sometimes adding this path results in an expected error of it not being the right target machine.
I’ve tried adding the path to the folder and to the file to the linker dependancies, i’ve tried adding it to the VC++ Directories for all entries except include. Basically anything that i’ve found suggested on the net.
This is so frustrating as i’ve not done anything other than install VS and it wont work! So i dont know am i missing something?
Many thanks in advance
‘Oom
Answers
You have not provided all pertinent information.
Quote>i’ve just done a complete install of Visual Studio 2008
Was this actually VS or was it one or more of the language products?
Which edition? Express? Standard? Professional? Note that this
forum is for issues related to the Express Editions of VC++.
If VC Express, how did you install it? Via the MS web install or via
a downloaded ISO disc?
If Express, what other supporting libraries have you installed?
MSDN? Win32 SDK?
Quote>On my system, the only Kernel32.lib is located at: Quote>C:Program FilesMicrosoft SDKsWindowsv5.0LibIA64
When and why did you install this version of the SDK? What is your
hardware platform? You have the SDK libs for Itanium processors.
It is certainly not the latest, and not even as recent as the version
originally available when VC 2008 was initially released. If you are
running on an Intel/AMD x86 system you should have at least v6.0a and
there should be a kernel32.lib for 32-bit (in lib) and one for 64-bit (in Libx64).
If you actually do have Visual Studio 2008, you may not have completed
и соответствующих lib файлов в них. Если папки отсуствуют, значит вы не установили Windows SDK…
0
1754 / 1346 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
19.04.2017, 00:47
5
MaestroZoom, у меня было такое. Помогла смена SDK в свойствах проекта
0
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 57
19.04.2017, 15:55
[ТС]
6
Да, все на месте WindowsApp.lib.
Добавлено через 3 часа 5 минут
Someone007, Да, все на месте WindowsApp.lib.
0
6270 / 3898 / 1567
Регистрация: 09.05.2015
Сообщений: 9,188
19.04.2017, 16:00
7
Причем тут WindowsApp.lib? У вас же других либ не хватало, они тоже все на месте?
0
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 57
19.04.2017, 16:16
[ТС]
8
Других нет. Пробую переустановить VS, если не поможет попробую скачать не достающий файл. Забавно то, что после обновления VS появилась данная проблема.
0
6270 / 3898 / 1567
Регистрация: 09.05.2015
Сообщений: 9,188
19.04.2017, 16:26
9
Сообщение было отмечено MaestroZoom как решение
Решение
Запустите Visual Studio Installer из меню Start, в разделе «Individual Components» проверьте установлен ли Windows SDK.
Миниатюры
3
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 57
19.04.2017, 22:57
[ТС]
10
Тот компонент что вы указали там нет. Я выбрал более схожий с ним.
0
6270 / 3898 / 1567
Регистрация: 09.05.2015
Сообщений: 9,188
19.04.2017, 23:01
11
Сообщение от MaestroZoom
Тот компонент что вы указали там нет. Я выбрал более схожий с ним.
Это вероятно зависит от вашей ОС. У меня на Win10 доступно то что на скриншоте, если у вас более ранняя версия ОС (Win7/8/8.1/10 без последнихх обновлений), то там будут соответственно другие версии Windows SDK.
1
0 / 0 / 0
Регистрация: 03.04.2017
Сообщений: 57
20.04.2017, 12:37
[ТС]
12
У меня тоже Win. 10. Все, нашел, просто он был чуть выше. При переустановке отметил его и все заработало. Спасибо)
I ran into a similar problem listed here. I was using intel visual fortran 10.1 and microsoft visual studio 2008 to compile Abaqus User subroutine. they worked successfully previously, but later, I got a error message: WindowsSdkDir not found.
I reinstalled the microsoft visual studio 2008 sp1 and this time installwindows SDK 1.1, but it doesn’t work anyway.
Then i found out some suggestion provided in this thread. According to the suggestion:
————————————————————————————- Now in Visual Studio, select Tools > Options > Intel Fortran > Compilers. Click the … button next to Libraries and see if it includes this line:
$(WindowsSdkDir)lib
If it does not, add it, click OK and then try a rebuild and see if that helps.
If not, select Tools > Visual Studio 2008 Command Prompt (Oddly, in my VS2008, this reads «Visual Studio 2005 Command Prompt». In the window that opens, type:
set windowssdkdir
—————————————————————————————————————- Tools > Options > Intel Fortran > Compilers. Click the … button next to Libraries I got the following information:
for platform X64, the content is as follows:
$(IFortInstallDir)Lib
$(VCInstallDir)atlmfclibamd64
$(VCInstallDir)libamd64
$(WindowsSdkDir)libx64
For platform win32, the content is as follows:
$(IFortInstallDir)Lib
$(VCInstallDir)atlmfclib
$(VCInstallDir)lib
$(WindowsSdkDir)lib
The platform of my computer is x64.
For the second suggestion, I didn’t find visual studio 2008 command prompt underneath Tools, so i went to Start > all programs > microsoft visual studio 2008 > visual studio tools > Visual studio 2008 Command Prompt and type Set WindowsSdkDir
the following content was shown: WindowsSdkDir=C:Program Files (x86)microsoft visual studio 9.0VCPlatformSDK
However, i could not findfolder PlatformSDK underneath folder VC.
then i went tochecked the registry,I got the following information:
«ProductName»=»Microsoft Windows SDK for Visual Studio 2010» However, underneath C:Program Files (x86)Microsoft SDKsWindows, i only saw two folders, which are v5.0 and v6.0A, nofolder v7.0A. inside folder v5.0, i only saw two folders, which are include, and lib. inside folder v6.0A, i only saw folder bin and Bootstrapper.
Could you please tell me how to solve this problem? Thank you so much in advance.
Библиотеки для розничной торговли, отладки или платформы
Библиотека vccorlib.lib
Библиотеки в проектах из интернета или других источников
Обновленные библиотеки Windows SDK
Не удается открыть сторонний файл библиотеки
Не удается открыть файл, созданный проектом
Не удается открыть файл C:Program.obj
Другие распространенные проблемы
Проблемы с путем или именем файла
Параллельная синхронизация сборки
Дополнительные зависимости, указанные в интегрированной среде разработки
Слишком длинные пути
Слишком большие файлы
Неправильные разрешения на файл
Недостаточно места на диске
Проблемы в переменной среды TMP
Помощь, моя проблема не указана здесь!
Visual Studio C ++ / CLI Таинственная ошибка с шаблоном
Решение
Другие решения
Ошибка средств компоновщика LNK1104
Эта ошибка возникает, когда компоновщику не удается открыть файл для чтения или записи. Ниже перечислены две наиболее распространенные причины проблемы.
программа уже запущена или загружена в отладчик и
пути к библиотеке неверны или не заключены в двойные кавычки.
Эта ошибка может быть вызвана многими другими возможными причинами. Чтобы сузить их, сначала проверьте, какой тип файла имеет имя файла . Затем используйте следующие разделы, чтобы определить и устранить конкретную проблему.
Не удается открыть приложение или PDB-файл
Приложение запущено или загружено в отладчик.
Если имя файла — это имя исполняемого файла или связанный PDB-файл, проверьте, запущено ли приложение. Затем проверьте, загружена ли она в отладчик. Чтобы устранить эту проблему, остановите программу и выгрузите ее из отладчика перед повторной сборкой. Если приложение открыто в другой программе, например редактор ресурсов, закройте его. Если программа не отвечает, может потребоваться использовать диспетчер задач для завершения процесса. Кроме того, может потребоваться закрыть и перезапустить Visual Studio.
Антивирусные программы часто временно блокируют доступ к вновь созданным файлам, особенно .exe и .dll исполняемым файлам. Чтобы устранить эту проблему, попробуйте исключить каталоги сборки проекта из антивирусного сканера.
Не удается открыть файл библиотеки Майкрософт
Библиотеки Windows, такие как kernel32.lib
Если файл, который не удается открыть, является одним из файлов стандартной библиотеки, предоставляемых корпорацией Майкрософт, например kernel32.lib, может возникнуть ошибка конфигурации проекта или ошибка установки. Убедитесь, что пакет WINDOWS SDK установлен. Если для проекта требуются другие библиотеки Майкрософт, такие как MFC, убедитесь, что компоненты MFC также установлены установщиком Visual Studio. Установщик можно запустить еще раз, чтобы добавить дополнительные компоненты в любое время. Дополнительные сведения см. в Изменение Visual Studio. Используйте вкладку «Отдельные компоненты » в установщике, чтобы выбрать определенные библиотеки и пакеты SDK.
Библиотеки vcruntime с версиями
Если сообщение об ошибке содержит версию библиотеки Майкрософт, например msvcr120.lib, набор инструментов платформы для этой версии компилятора может быть не установлен. Чтобы устранить эту проблему, у вас есть два варианта: обновить проект, чтобы использовать текущий набор инструментов платформы, или установить старый набор инструментов и выполнить сборку проекта без изменений. Дополнительные сведения см. в разделе «Обновление проектов с более ранних версий Visual C++ и использование собственного многонацеливания в Visual Studio для сборки старых проектов».
Библиотеки для розничной торговли, отладки или платформы
Эта ошибка может возникнуть при первой сборке для новой целевой платформы или конфигурации, например розничной торговли или ARM64. Убедитесь, что в интегрированной среде разработки установлены набор инструментов платформы и версия windows SDK , указанные на странице свойств «Общие «. Также убедитесь, что необходимые библиотеки доступны в каталогах библиотек, указанных на странице свойств каталогов VC++. Проверьте свойства каждой конфигурации, такие как отладка, розничная торговля, x86 или ARM64. Если одна сборка работает, но другая нет, сравните параметры для обоих. Установите все отсутствующие необходимые средства и библиотеки.
Библиотека vccorlib.lib
Для приложений или компонентов универсальной платформы Windows (UWP) нет библиотек, смягчаемых spectre. Если сообщение об ошибке содержит vccorlib.lib, возможно, вы включили /Qspectre в проекте UWP. Отключите параметр компилятора /Qspectre , чтобы устранить эту проблему. В Visual Studio измените свойство «Устранение рисков Spectre «. Он находится на странице создания кодаC/C++> диалогового окна страниц свойств проекта.
Библиотеки в проектах из интернета или других источников
При сборке проекта, скопированного с другого компьютера, расположения установки библиотеки могут отличаться. Для сборок командной строки убедитесь, что переменная среды LIB и пути библиотеки заданы правильно для сборки. В Visual Studio можно просматривать и изменять текущие пути библиотеки, заданные на страницах свойств проекта. На странице каталогов VC++ выберите раскрывающийся список для свойства «Каталоги библиотеки «, а затем нажмите кнопку «Изменить«. В разделе «Оцененное значение » диалогового окна «Каталоги библиотеки » перечислены текущие пути, которые искали файлы библиотеки. Обновите эти пути, чтобы они указывали на локальные библиотеки.
Обновленные библиотеки Windows SDK
Эта ошибка может возникать, если путь Visual Studio к Пакету SDK для Windows устарел. Это может произойти, если вы устанавливаете более новый пакет SDK для Windows независимо от установщика Visual Studio. Чтобы исправить его в интегрированной среде разработки, обновите пути, указанные на странице свойств каталогов VC++. Задайте версию в пути, чтобы она соответствовала новому пакету SDK. Если вы используете командную строку разработчика, обновите пакетный файл, который инициализирует переменные среды новыми путями пакета SDK. Эту проблему можно избежать с помощью установщика Visual Studio для установки обновленных пакетов SDK.
Не удается открыть сторонний файл библиотеки
Эта проблема связана с несколькими распространенными причинами.
Путь к файлу библиотеки может быть неправильным или не заключен в двойные кавычки. Или, возможно, вы не указали его компоновщику.
Возможно, вы установили 32-разрядную версию библиотеки, но вы создаете для 64-разрядных или наоборот.
Библиотека может иметь зависимости от других библиотек, которые не установлены.
Чтобы устранить проблему пути для сборок из командной строки, убедитесь, что задана переменная среды LIB. Убедитесь, что он содержит пути для всех используемых библиотек и для каждой сборки конфигурации. В интегрированной среде разработки пути библиотеки задаются свойствомкаталогов>библиотеки VC++. Убедитесь, что все каталоги, содержащие необходимые библиотеки, перечислены здесь для каждой сборки конфигурации.
Возможно, потребуется указать каталог библиотеки, который переопределяет каталог стандартной библиотеки. В командной строке используйте параметр /LIBPATH . В интегрированной среде разработки используйте свойство «Дополнительные каталоги библиотек» на странице свойств компоновщика > конфигурации > общего свойства проекта.
Убедитесь, что установлены все версии библиотеки, необходимые для конфигураций, которые вы создаете. Рассмотрите возможность использования служебной программы управления пакетами vcpkg для автоматизации установки и установки для многих общих библиотек. Когда это возможно, лучше создавать собственные копии сторонних библиотек. После этого вы уверены, что все локальные зависимости библиотек созданы для тех же конфигураций, что и проект.
Не удается открыть файл, созданный проектом
Эта ошибка может появиться, если имя файла еще не существует, когда компоновщик пытается получить к нему доступ. Это может произойти, если один проект зависит от другого в решении, но проекты создаются в неправильном порядке. Чтобы устранить эту проблему, убедитесь, что ссылки на проекты заданы в проекте, который использует файл. Затем отсутствующий файл будет создан до его необходимости. Дополнительные сведения см. в статье «Добавление ссылок в проектах Visual Studio C++ и управление ссылками в проекте».
Не удается открыть файл C:Program.obj
Если в сообщении об ошибке отображается имя файла C:Program.obj , заключите пути библиотеки в двойные кавычки. Эта ошибка возникает, когда несмеченный путь, начинающийся с C:Program Files , передается компоновщику. Несмеченные пути также могут привести к аналогичным ошибкам. Как правило, они отображают непредвиденный OBJ-файл в корне диска.
Чтобы устранить эту проблему для сборок из командной строки, проверьте параметры параметра /LIBPATH . Также проверьте пути, указанные в переменной среды LIB, и пути, указанные в командной строке. Обязательно используйте двойные кавычки для всех путей, включающих пробелы.
Чтобы устранить эту проблему в интегрированной среде разработки, добавьте двойные кавычки при необходимости в следующие свойства проекта:
Свойство «Каталоги библиотеки » на странице свойств каталогов VC++ «Свойства > конфигурации» ,
Свойство Additional Dependencies (Дополнительные зависимости) на странице входных данных компоновщика свойств компоновщика > конфигурации>.
Другие распространенные проблемы
Проблемы с путем или именем файла
Эта ошибка может возникать, если имя файла библиотеки или путь, указанный компоновщику, неправильный. Или, если путь содержит недопустимую спецификацию диска. Просмотрите командную строку или в любой директиве #pragma comment( lib, «library_name» ) для проблем. Проверьте орфографию и расширение файла и убедитесь, что файл существует в указанном расположении.
Параллельная синхронизация сборки
Если вы используете параметр параллельной сборки, Visual Studio, возможно, заблокировали файл в другом потоке. Чтобы устранить эту проблему, убедитесь, что один и тот же объект кода или библиотека не встроены в несколько проектов. Используйте зависимости сборки или ссылки на проекты для получения встроенных двоичных файлов в проекте.
Дополнительные зависимости, указанные в интегрированной среде разработки
При указании отдельных библиотек непосредственно в свойстве «Дополнительные зависимости» используйте пробелы для разделения имен библиотек. Не используйте запятые или точки с запятой. Если вы используете пункт меню «Изменить «, чтобы открыть диалоговое окно «Дополнительные зависимости» , используйте новые строки, чтобы разделить имена, а не запятые, точки с запятой или пробелы. Также используйте новые линии при указании путей к библиотеке в диалоговых окнах каталогов библиотек и дополнительных каталогов библиотек .
Слишком длинные пути
Эта ошибка может появиться, когда путь к имени файла расширяется до более чем 260 символов. При необходимости измените структуру каталога или сократите имена папок и файлов, чтобы сократить пути.
Слишком большие файлы
Эта ошибка может возникнуть из-за слишком большого размера файла. Библиотеки или файлы объектов, превышающие размер гигабайта, могут вызвать проблемы для 32-разрядного компоновщика. Возможное исправление этой проблемы — использовать 64-разрядный набор инструментов. Дополнительные сведения об использовании 64-разрядного набора инструментов в командной строке см. в разделе «Практическое руководство. Включение 64-разрядного набора инструментов Visual C++ в командной строке». Сведения об использовании 64-разрядного набора инструментов в интегрированной среде разработки см. в статье «Использование MSBuild с 64-разрядным компилятором и инструментами». См. также эту запись Stack Overflow: как сделать Visual Studio использовать собственную цепочку инструментов amd64.
Неправильные разрешения на файл
Эта ошибка может возникнуть, если у вас недостаточно разрешений на доступ к имени файла. Это может произойти, если вы используете обычную учетную запись пользователя для доступа к файлам библиотек в защищенных системных каталогах. Или, если вы используете файлы, скопированные другими пользователями, которые по-прежнему имеют свои исходные разрешения. Чтобы устранить эту проблему, переместите файл в каталог проектов, доступный для записи. Если перемещаемый файл имеет недоступные разрешения, выполните команду takeown.exe в окне командной строки администратора, чтобы взять на себя владение файлом.
Недостаточно места на диске
Ошибка может возникать, если у вас недостаточно места на диске. Компоновщик использует временные файлы в нескольких ситуациях. Даже если у вас достаточно места на диске, большая ссылка может очертить или фрагментировать доступное место на диске. Рассмотрите возможность использования параметра /OPT (оптимизация); выполнение транзитивного исключения COMDAT считывает все файлы объектов несколько раз.
Проблемы в переменной среды TMP
Если имя файла называется LNKnnn, это имя файла, созданное компоновщиком для временного файла. Каталог, указанный в переменной среды TMP, может не существовать. Или для переменной среды TMP может быть указано несколько каталогов. Для переменной среды TMP следует указать только один путь к каталогу.
Помощь, моя проблема не указана здесь!
Если ни одна из перечисленных здесь проблем не возникает, вы можете использовать средства обратной связи в Visual Studio для получения справки. В интегрированной среде разработки перейдите в строку меню и выберите «Отправить > отзыв о > проблеме«. Кроме того, отправьте предложение с помощью справки > по отправке отзывов>. Вы также можете использовать сайт Microsoft Learn Q&A для вопросов и веб-сайт Visual Studio C++ Сообщество разработчиков. Используйте эти сайты для поиска ответов на вопросы и запроса справки. Дополнительные сведения см. в статье «Как сообщить о проблеме с набором инструментов или документацией visual C++».
Если вы обнаружили новый способ устранения этой проблемы, которую мы должны добавить в эту статью, сообщите нам об этом. Вы можете отправить нам отзыв с помощью кнопки ниже для этой страницы. Используйте его для создания новой проблемы в репозитории GitHub документации по C++. Спасибо!
Источник
Visual Studio C ++ / CLI Таинственная ошибка с шаблоном
Ну, я пытался создать C ++ DLL в Visual Studio 2015, что заняло какое-то время, так как я не очень хорош в Visual Studio.
Мне нужно получить доступ к библиотекам .NET, в частности System :: Management. (Написание кода было немного сложнее, чем требовалось из-за плохой реализации C ++, но, по крайней мере, он есть.)
Я исправил очевидные ошибки и, наконец, понял, что мне нужно включить CLR в свойствах проекта, а затем выбрать связанные библиотеки с помощью References-> Add Reference. Но после всего этого, теперь это просто странная ошибка:
Компилятор не показывает красные волнистые линии под чем-либо, и ошибка утверждает, что строка — «1», а файл — «ССЫЛКА», так что тут никакой помощи.
Я подумал, что, возможно, где-то испортил конфигурацию проекта, поэтому я создал новый проект и перенес код. Ошибка все еще произошла. Если я отключил CLR и прокомментировал .NET-зависимый код, сборка прошла без ошибок.
Поэтому я попытался создать новый проект из шаблона (Visual C ++ -> Win32 Console Application) и затем включить CLR, прежде чем делать что-либо еще. Затем я попробовал еще раз, выбрав разные версии .NET Framework.
Наконец, я попытался создать проект с шаблоном (Visual C ++ -> CLR -> CLR Console Application) и сразу же создать его. Я имею в виду буквально, не делая ничего другого. Это все еще дало ту же ошибку!
Что на земле происходит? Я что-то не так делаю или VS2015 просто сломан?
Решение
Попробуй это, Щелкните правой кнопкой мыши проект, который показывает «LNK1104: невозможно открыть файл« MSCOREE.lib », затем выберите« Свойства »->« Свойства конфигурации »->« Каталоги VC ++ »->« Каталоги библиотек »-> Добавить обе записи снизу, разделенные точкой с запятой
Именно здесь должен быть ваш mscoree.lib, проверьте его там, прежде чем делать это, в противном случае вам может потребоваться установить / переустановить Microsoft SDK.
Другие решения
В некоторых ситуациях SDK может не установить необходимые файлы в папке LIB, как описано в MSCoree.lib отсутствует в WinSDK . Их решение состояло в том, чтобы выполнить ремонт установки. Это может не сработать.
Я успешно побежал WinSDKInterop_amd64WinSDKInterop_amd64.msi в результате чего создается:
I started learning C++ using the book «Ivor Horton’s Beginning Visual C++ 2012».
I tried the 1st exercise given in the book as follows;
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello World n";
return 0;
}
When I clicked «Build», I get this error message;
» Error LNK1104: cannot open file ‘kernel32.lib’ «.
I reinstalled the Visual Studio 2012 but again I get this error message.
I have Visual Studio 2013 installed in my computer and this same code build successfully and worked well.
Can you please let me why this error comes up in VS 2012 and not in VS 2013.
Thanks
Kind Regards
VKSBK
A Real Novice Programmer !
Edited by
Sunday, July 10, 2016 9:57 AM
Answers
Hi V.K.S.B.K,
thanks for posting here.
For your case, I suggest you check these things below:
1. Check if you have installed the Windows SDK for your version. For example, win8 SDK
2. Check if $(WindowsSdkDir)lib is included in the directories list, if not, manually add it.
3. Check if the value of WindowsSdkDir is correct.
Best Regards,
Sera Yu
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Proposed as answer by Baron Bi Friday, July 15, 2016 9:02 AM
Marked as answer by Hart Wang Monday, July 18, 2016 8:05 AM
I started learning C++ using the book «Ivor Horton’s Beginning Visual C++ 2012».
I tried the 1st exercise given in the book as follows;
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello World n";
return 0;
}
When I clicked «Build», I get this error message;
» Error LNK1104: cannot open file ‘kernel32.lib’ «.
I reinstalled the Visual Studio 2012 but again I get this error message.
I have Visual Studio 2013 installed in my computer and this same code build successfully and worked well.
Can you please let me why this error comes up in VS 2012 and not in VS 2013.
Thanks
Kind Regards
VKSBK
A Real Novice Programmer !
Edited by
Sunday, July 10, 2016 9:57 AM
Answers
Hi V.K.S.B.K,
thanks for posting here.
For your case, I suggest you check these things below:
1. Check if you have installed the Windows SDK for your version. For example, win8 SDK
2. Check if $(WindowsSdkDir)lib is included in the directories list, if not, manually add it.
3. Check if the value of WindowsSdkDir is correct.
Best Regards,
Sera Yu
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Proposed as answer by Baron Bi Friday, July 15, 2016 9:02 AM
Marked as answer by Hart Wang Monday, July 18, 2016 8:05 AM
Пожалуйста, сообщите об этом — просто выделите ошибочное слово или фразу и нажмите Shift Enter.
Блог одного Сумасшествия
Eclipse, Android Studio: FAQ, устранение ошибок
Добавил(а) microsin
Здесь собраны решения проблем, которые возникают с IDE Eclipse, Android Studio, и другие вопросы программирования под Android. Все непонятные термины и сокращения ищите в статье «Словарик Android» [7].
[131228]
Q001. Что такое API Level, API number (API 3, API4, API 7, и т. д.)?
API переводится как интерфейс программирования, в данном контексте это относится к операционной системе Android, к вызову встроенных в систему подпрограмм и функций. Цифра соответствует определенной версии сборки OS Android, см. таблицу. [1].
Q002. Для чего нужен Google USB Driver?
Google USB Driver относится к набору инструментария для автоматизации тестируемых приложений (программ) на телефон/устройство с операционной системой Android. Нужен только для операционной системы Windows, см. [2, 3, 4].
Q003. Что такое Android WebDriver?
Программное обеспечение, которое позволяет запускать автоматизированные сквозные тесты. Эти тесты помогут убедиться, что ваш сайт работает корректно в браузере Android.
Q004. Что такое Activity?
Это слово в контексте программирования Android можно перевести как «видимая деятельность программы». Это основной компонент приложения (программы) для Android, свойства и методы которого определяют работу (поведение) и внешний вид программы. Каждое отдельное окно приложения представлено отдельным компонентом Activity.
Q005. Что такое Gradle?
Специальный плагин для Android Studio, позволяющий автоматизировать сборку приложений на Java. Именно с ним больше всего головной боли у разработчиков при переходе на разные версии Android Studio и JDK, особенно при импорте Android-приложений, созданных в среде разработки Eclipse.
Q006. Проблема с запуском виртуального устройства при отладке.
Я создал виртуальное устройство (AVD) для эмулятора Android Studio, на котором пытаюсь отладить свою программу. Но почему-то не могу запустить в эмуляторе мою AVD (на экране постоянно висит в центре экрана переливающаяся надпись ANDROID). Когда пытаюсь запустить свою программу, то в логе Atmel Studio вижу сообщение об ошибке «Adb Transfer Protocol Error», «No such file or directory». В чем проблема?
При использовании эмулятора Android Studio нужно иметь в виду, что он чрезвычайно прожорлив в плане расхода памяти и ресурсов процессора компьютера. Так что скорее всего, Вы создали AVD слишком мощное, и поэтому оно запускается в эмуляторе слишком долго. Когда в такой ситуации Вы пытаетесь запустить отладку, то скорее всего получите сообщение наподобие следующего:
Waiting for device.
"C:Program FilesAndroidandroid-studiosdktoolsemulator.exe" -avd AVD-GT-N7000 -netspeed full -netdelay none
Device connected: emulator-5554
Device is online: emulator-5554
Target device: AVD-GT-N7000 [emulator-5554]
Uploading file
local path: C:Documents and SettingsUserAndroidStudioProjectsMyApplicationProjectMyApplication buildapkMyApplication-debug-unaligned.apk
remote path: /data/local/tmp/com.example.myapplication
Adb Transfer Protocol Error.
No such file or directory
Это означает, что отлаживаемое приложение не может загрузиться в эмулятор, так как эмулятор еще не запустился. Чтобы решить проблему с отладкой, у Вас есть следующие варианты:
1. Перед запуском отладки нужно дождаться полной загрузки AVD в эмуляторе, и только потом запускать отладку. Наберитесь терпения, первая загрузка новой машины может занимать до 10 минут и более, в зависимости от её свойств и мощности Вашего компьютера. Чтобы ускорить загрузку эмулятора, используйте снапшоты для AVD (при создании AVD поставьте галочку Snapshot). 2. Создать другую AVD, требующую меньше ресурсов (выбрать модель смартфона с меньшим разрешением экрана и с меньшим API level). 3. Запустить отладку на виртуальной машине, см. [4]. 4. Установить Google USB Driver и отлаживаться на реальном устройстве с операционной системой Android.
Q007. Случайно закрыт визуальный редактор формы…
Я редактирую разметку окна программы (форму) — файл activity_main.xml, и случайно закрыл окно просмотра внешнего вида формы (окошко, где показано окно моей программы). Как мне снова открыть просмотр формы? Как переключаться между текстовым редактированием формы (как XML-файла) и графическим редактированием (когда можно визуально редактировать форму, мышкой перетаскивать компоненты и менять их свойства)? Для просмотра редактируемой формы выберите в меню View -> Tool Windows -> Preview. Для переключения между текстовым и визуальным вариантами редактирования формы служат нижние табы окна редактора — Design (визуальное редактирование формы) и Text (редактирование формы как XML-текста).
Q008. Почему не работает просмотр иерархии (Hierarchy View)…
… в программе Android Debug Monitor, когда я подключаюсь через USB (или Wi-Fi) к отлаживаемому устройству?
[2014-01-01 15:59:08 - hierarchyviewer]Unable to get view server version from device 0019a2fe5212ce
[2014-01-01 15:59:08 - hierarchyviewer]Unable to get view server protocol version from device 0019a2fe5212ce
[2014-01-01 15:59:08 - ViewServerDevice]Unable to debug device: samsung-gt_n7000-0019a2fe5212ce
[2014-01-01 15:59:08 - hierarchyviewer]Missing forwarded port for 0019a2fe5212ce
[2014-01-01 15:59:08 - hierarchyviewer]Unable to get the focused window from device 0019a2fe5212ce
Почти никакие телефоны и смартфоны общего производства не позволят HierarchyViewer получать доступ к ним. Обычно специальные телефоны разработчика и эмуляторы оснащены функциями, работающими с HierarchyViewer. Есть обходной способ решения проблемы, если использовать класс ViewServer в разрабатываемом приложении (см. ViewServer Local server for Android’s HierarchyViewer site:github.com).
Q009. Что такое R (R.java)?
R.java — автоматически генерируемый (средой разработки Eclipse) Java-код, который определяет специальный Java-класс ресурсов приложения R. Этот файл пересоздается, когда Вы делаете очистку или компиляцию проекта. В классе R содержатся значения идентификаторов ресурсов, которые были определены в визуальном редакторе или в соответствующем XML-файле ресурсов.
Q010. Как посмотреть последние сообщения ядра (dmesg) …
… при загрузке или установке новых устройств? Другими словами, есть ли на Android аналог dmesg?
На Андроид файл /proc/kmsg является аналогом dmesg в Linux, однако для просмотра файла /proc/kmsg (например, командой cat /proc/kmsg) нужны права root. Есть также файл /proc/last_kmesg, для его просмотра права root не нужны.
Q011. Что такое Android rooted device? Какие преимущества это дает, какие недостатки?
Пользователь root — это специальный аккаунт в UNIX системах (к которым относится также и Android), который позволяет выполнять все операции в системе без ограничений. Пользователь с правами root получает доступ ко всем системным и аппаратным ресурсам и данным, с возможностью их редактирования и удаления. Подробнее см. [5].
[140126]
Q012. Path variable name cannot contain character.
При попытке создать новую переменную окружения проекта (свойства проекта -> Resource -> Linked Resources -> Path Variables -> New…) выдается ошибка, что имя переменной не может содержать недопустимый символ. В данном случае это точка.
Удалите точку из имени, и переменная создастся нормально.
Q013. LINK : fatal error LNK1104: не удается открыть файл «kernel32.lib».
Проблему можно решить так: C/C++ Build -> Settings -> Linker (link) -> Libraries -> Additional Libpath (/libpath) -> нажать на кнопочку с зеленым плюсиком -> указать папку c:Program FilesMicrosoft Visual Studio .NET 2003Vc7lib.
Или так: C/C++ General -> Paths and Symbols -> Libraries -> Add… -> File system… -> c:Program FilesMicrosoft Visual Studio .NET 2003Vc7libkernel32.lib.
Q014. LINK : fatal error LNK1104: не удается открыть файл «C:Program.obj».
Ошибка скорее всего в том, что в конфигурации проекта добавлен путь до библиотеки, содержащий двойные кавычки, например «c:Program FilesMicrosoft Visual Studio .NET 2003Vc7libkernel32.lib». Пути до линкуемых библиотек настраиваются в свойствах проекта C/C++ Build -> Settings -> Linker (link) -> Libraries -> Additional Libpath (/libpath), C/C++ Build -> Settings -> Linker (link) -> Libraries -> Libraries, C/C++ General -> Paths and Symbols -> Libraries -> Add… -> File system…
Уберите кавычки из пути, и ошибка LNK1104 исчезнет (поменяйте «c:Program FilesMicrosoft Visual Studio .NET 2003Vc7libkernel32.lib» на c:Program FilesMicrosoft Visual Studio .NET 2003Vc7libkernel32.lib).
Не запускается в эмуляторе приложение Android с ошибкой. Пример вывода в консоли сообщений об ошибке:
[2014-01-26 16:14:43 - HelloWorldAndroid] Dx trouble writing output: already prepared
[2014-01-26 16:14:44 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
[2014-01-26 16:14:44 - HelloWorldAndroid] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
Решение проблемы: закройте Eclipse. Зайдите в каталог Android SDK (c:Program FilesAndroidandroid-studiosdktools), выполните команду android sdk. Запустится SDK Manager. Удалите Android SDK Build-tools 19, и установите Android SDK Build-tools 18.1.1. Снова запустите Eclipse, и выполните отладку в эмуляторе, проблема исчезнет.
Q016. Как запустить SDK Manager на Windows?
Вот возможные способы:
• Из Eclipse (с установленным плагином ADT) выполните команду меню Window -> Android SDK Manager. • Перейдите в папку tools пакета Android SDK (полный путь может быть наподобие c:Program FilesAndroidandroid-studiosdktools) и выполните команду android.bat sdk.
[140204]
Q017. Приложение (файл .apk) не устанавливается …
… с сообщением «Ошибка разбора данных», «Сбой разбора пакета». Команда ant debug install для этого приложения завершается с сообщением [INSTALL_FAILED_OLDER_SDK].
Проверьте, на какой уровень API скомпилировано приложение. Уровень API Android (API Level [1]) на сегодняшний день может меняться от 1 до 19, что соответствует версии Android от Android 1.0 до Android 4.4. Если приложение рассчитано на более современную версию (более высокий уровень API), чем установленная система на Вашем устройстве Android, то программа не установится и не запустится. Версию системы устройства можно узнать через Настройки -> Об устройстве -> Версия Android (версия обычно состоит из нескольких цифр и точек, наподобие 4.1.2). Уровень API, соответствующий версии, можно узнать из таблицы [1].
[140221]
Q018. Добавление обработчика события для визуального компонента.
Я привык, когда двойным кликом на элементе в визуальном редакторе автоматически создается обработчик события для элемента, но в Eclipse этого не происходит. Как добавить обработчик события на визуальном объекте (обработчик события клика на кнопке)? Процесс по шагам на примере кнопки:
1. Откройте визуальный редактор формы Вашего приложения, для чего сделайте двойной щелчок на XML-файле описания внешнего вида интерфейса Вашей программы (этот файл находится в Project Explorer -> Имя проекта -> res -> layout -> activity_blabla.xml). Переключитесь на графический вид просмотра формы (закладка Graphical Layout).
2. В визуальном редакторе бросьте на форму кнопку. Выберите её, и в редакторе свойств Properties дайте более подходящее Id и введите нужный текст, отображаемый на кнопке. К примеру, Id по умолчанию будет @+id/button1, Вы можете задать что-то типа @+id/MyButtonId.
3. Разрешите Вашему классу Activity прослушивать события кликов на визуальных компонентах реализацией OnClickListener. Для этого откройте файл ИмяПроектаActivity.java (Project Explorer -> Имяпроекта -> src -> имяпакета), и расширьте определение класса Activity:
7. Теперь нужно создать обработчик события клика onClick на внешнем виде формы (View). Для этого добавьте в класс Activity определение нового метода onClick:
// Реализация обработчика события для OnClickListner.// Функция onClick будет вызываться всякий раз, когда// будет сделан клик на интерфейсе программы.@OverridepublicvoidonClick(View v){// Параметр v означает вид, на котором сделан клик.// Функция getId() возвращает идентификатор этого вида.if(v.getId()== R.id.myButtonId){// тут код для действий по кнопке myButton;..}elseif(v.getId()== R.id.myButtonIdA){// тут код для действий по кнопке myButtonA;..}// и так далее, для всех визуальных элементов, принимающих клик.}
Вот полный пример листинга кода Activity:
package com.myApp;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassFirstActivityextends Activity implements OnClickListener {// Декларирование элементов UI.private TextView changingTextView;private Button firstButton;private Button secondButton;/** Вызывается, когда activity создается впервые. */@OverridepublicvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.main);// Наш единственный дизайн для этого приложения// размещен в файле main.xml.// Инициализация компонентов визуального интерфейса.
changingTextView =(TextView) findViewById(R.id.changingTextView);
firstButton =(Button) findViewById(R.id.leftButton);// Когда мы создаем кнопку, и нам нужно обрабатывать с нее события,// то нужно установить для неё прослушиватель (listener).// Вызов в качестве аргумента this означает, что события будут передаваться// родительскому экземпляру класса, в данном случае это наша Activity.
firstButton.setOnClickListener(this);
secondButton =(Button) findViewById(R.id.rightButton);
secondButton.setOnClickListener(this);}// Реализация с OnClickListner: onClick будет вызван всякий раз, когда происходит// клик в каком-то месте вида программы.@OverridepublicvoidonClick(View v){// Параметр v означает вид (визуальный элемент), на котором сделан клик. // Функция getId() возвращает идентификатор этого вида. По его значению// можно декодировать, какая кнопка нажата.if(v.getId()== R.id.leftButton){// setText() устанавливает значение строки в TextView
changingTextView.setText("Вы кликнули кнопку слева");}elseif(v.getId()== R.id.rightButton){
changingTextView.setText("Вы кликнули кнопку справа");}}}
Q019. Откуда возникают ошибки, связанные с вычислением переменных среды Eclipse …
… наподобие «Specified Java project ‘null’ does not exist.», «Variable references empty selection: ${project_name}»?
Когда запускается конфигурация компиляции или внешний инструментарий, то значение переменных вычисляется по выбранному месту в окне Project Explorer. Обычно достаточно выбрать имя проекта (корневую папку), к которому относится запуск, и тогда ошибка исчезнет.
Q020. Как в Eclibse убрать красные маркеры ошибок из модуля C/C++? Почему при безошибочной компиляции ошибки все равно высвечиваются?
Почему проект Eclipse с native-кодом компилируется нормально, но в редакторе исходный код подсвечен с ошибками (не найдены некоторые заголовочные файлы и стандартные идентификаторы? Когда подключаете внешние файлы в native-коде (заголовки с расширением *.h), то должны делаться доступными определяемые в их теле новые символы. При этом несмотря на то, что компиляция кода проходит нормально, редактор кода все равно новые символы не видит. «Ошибочный» символ подчеркивается красным, и при наведении на него курсора высвечивается хинт, что символ «could not be resolved».
Нераспознанные символы в редакторе кода появляются потому, что плагин CDT не может найти подходящие заголовочные файлы. Чтобы редактор кода нормально видел подключенные символы, необходимо настроить (добавить) пути поиска файлов include в плагине CDT. Откройте свойства проекта, перейдите в раздел C/C++ General -> Path and Symbols -> на закладке Includes добавьте директории, где нужно искать заголовочные файлы. Вот пример добавленных путей поиска:
При добавлении путей учитывайте API Level целевой системы, для которой будет компилироваться приложение. В этом примере учтен API Level 16 (в составе пути имеется папка android-16).
Если после добавления путей все равно появляются «нераспознанные» символы, щелкните правой кнопкой мыши на имени проекта и выберите в контекстном меню Index -> Reresolve Unresolved Includes. Пункт меню Index -> Search for Unresolved Includes поможет Вам найти заголовочные файлы, которые не может подключить редактор.
Q021. Как управлять фокусом визуальных компонентов GUI?
Я расставил на форме несколько полей ввода, и мне нужно, чтобы определенное из этих полей после запуска программы получало фокус (стало текущим). Как это сделать?
Достаточно вызвать метод requestFocus. Пример куска кода из обработчика создания Activity onCreate:
Q022. Почему при отладке не срабатывают точки останова?
Breakpoint-ы не действуют потому, что Вы вероятно вместо отладки просто запустили приложение на устройстве, т. е. выполнили Run -> Run (Ctrl+F11). Чтобы точки останова срабатывали и была возможна пошаговая отладка, воспользуйтесь Run -> Debug (F11).
Другие причины проблемы отладки в Eclipse и способы решения:
1. Попробуйте принудительно разрешить отладку добавлением атрибута android:debuggable=»true» в тег < application > файла AndroidManifest.xml. Вообще-то с этой задачей должен автоматически справляться плагин ADT, однако это почему-то не всегда происходит.
2. Проверьте состояние кнопки «Skip all breakpoints» (пропустить все точки останова), которая находится на панели инструментов перспективы Debug (кнопка должна быть отжата). На всякий случай понажимайте на эту кнопку, и убедитесь, что все Ваши точки останова разрешены. Если перспектива Debug не открывается или не работает, то это означает, что Ваше отлаживаемое устройство некорректно подключено. Откройте перспективу DDMS и убедитесь, что Ваше устройство и работающее приложение перечислено в окне Devices, и доступно для отладки.
3. Если Вы пользуетесь для отладки эмулятором (виртуальным устройством, не реальным Android), то проблему старта отладки может вызывать долгий запуск эмулятора (эмулятор для запуска может требовать слишком много ресурсов, что конечно зависит от настроек виртуального устройства). Можно попробовать увеличить таймаут сессии ожидания adb от 3000 до 60000 мс и более.
Q023. Что такое Package name (имя пакета)?
Имя пакета предоставляет уникальный текстовый идентификатор для приложения. Это также имя по умолчанию для процесса приложения (см. манифесте приложения атрибут process элемента < application >) и по умолчанию свойство task affinity для (см. манифесте приложения атрибут taskAffinity элемента < activity >).
Имя пакета для приложения указывается в полном соответствии стилю языка Java, имя должно быть уникальным. Имя может содержать буквы верхнего и нижнего регистра (от ‘A’ до ‘Z’), цифры и подчеркивания (‘_’). Однако индивидуальные части имени пакета должны начинаться с буквы.
Во избежание конфликтов с другими разработчиками Вы должны использовать принцип организации имен наподобие доменного, но с указанием частей имени в обратном порядке. Например, приложения, опубликованные Google, будут иметь имя пакета, начинающееся на com.google. Также не нужно использовать для публикации пространство имен com.example.
Внимание: если Вы опубликовали Ваше приложение, то нельзя менять имя пакета, поскольку оно идентифицирует приложение. Если Вы поменяете имя пакета, то это будет означать, что получится другое приложение, и пользователи предыдущей версии не смогут получить обновление до новой версии.
Q024. Как в Eclipse сделать копию проекта? Как открыть готовый проект?
[Способ 1]
Чтобы сделать копию проекта, сделайте копию его корневой папки (той папки, где находятся файлы AndroidManifest.xml и project.properties), и затем переименуйте её. Копия проекта готова, теперь необходимо импортировать её в дерево проектов Eclipse.
Чтобы открыть копию проекта или любого готового проекта (который скачали из Интернета, к примеру), используйте меню File -> Import, далее выберите General -> Existing Projects into Workspace. Затем кликните Next и выберите корневую папку (root directory) проекта. Нажмите Finish, и через несколько секунд импорт завершится. Все, проект открыт.
[Способ 2]
• В дереве Package Explorer выделите мышью проект, который хотите скопировать (щелчком левой кнопки мыши на корневой папке проекта), нажмите Ctrl+C и Ctrl+V. Появится окно, в котором нужно задать новое имя проекта.
После подтверждения нового имени через несколько секунд в дереве проектов появится новый проект — копия имеющегося проекта под новым именем.
• Щелкните правой кнопкой на новой корневой папке проекта, и выберите в контекстном меню Android Tools -> Rename Application Package. Откроется окно, где нужно указать новое имя пакета, укажите имя и нажмите OK. Затем запустится мастер переименования имени пакета в различных исходных файлах проекта, в этом окне просто нажмите Finish.
• В дереве Package Explorer раскройте папку src проекта, щелкните правой кнопкой на имени пакета и выберите в контекстном меню Refactor -> Rename…, укажите новое имя пакета, щелкните OK.
• Выполните очистку проекта, для этого выберите в меню Project -> Clean…
• Если необходимо, то в атрибуте package поменяйте имя пакета приложения (файл AndroidManifest.xml):
Q025. Как импортировать в Eclipse проект из Android NDK samples?
Меню File -> New -> Project… -> Android -> Android Project from Existing Code, далее в поле ввода Root Directory выберите папку проекта из каталога NDK samples (например, это может быть папка c:android-ndk-r9csamplesTeapot). Если Вы предварительно сделали копию папки проекта NDK, то ставить галочку Copy projects into workspace необязательно. Нажмите Finish, и через несколько секунд импорт завершится.
[140223]
Q026. Java Build Path: не могу добавить библиотеку .JAR к проекту.
Почему когда я пытаюсь добавить к проекту библиотеку guava-16.0.1.jar, копию файла которой я поместил в каталог libs, то не могу это сделать через стандартный диалог свойств проекта Properties? Захожу в раздел Java Build Path, перехожу на закладку Libraries, жму кнопку Add JARs…, в браузере файла перехожу в папку libs, но почему-то там не виден файл guava-16.0.1.jar (скопированный туда через Проводник).
Причина в том, что среда Eclipse не синхронизировалась с файловой системой, поэтому файл guava-16.0.1.jar не виден. Чтобы исправить это, после копирования файла guava-16.0.1.jar в папку libs поставьте курсор на имя проекта и нажмите F5 (обновить), и только потом заходите в свойства проекта, чтобы добавить guava-16.0.1.jar в Java Build Path.
Если Вы иногда редактируете файлы вне среды Eclipse, то можете установить автообновление (auto-refresh) через меню Window -> Preferences, перейдите в раздел General -> Workspace, и поставьте 2 галочки «Refresh using native hooks or polling» и «Refresh on access».
[140301]
Q027. Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7’ instead. Please use Android Tools > Fix Project Properties
Щелкните правой кнопкой на имени проекта и выберите Android Tools -> Fix Project Properties.
Q028. Type ‘int32_t’ could not be resolved
В том файле, где возникает ошибка добавьте включение заголовочного файла:
#include < jni.h >
Общее правило для поиска заголовочного файла, который нужно подключить: среди заголовочных файлов NDK выбранной платформы (к примеру для платформы API Level 16 это будет папка c:android-ndk-r9cplatformsandroid-16arch-armusr) найдите файл с расширением *.h, где определен нужный тип.
[140302]
Q029. Member declaration not found
У меня эта странная ошибка возникала, если использовался тип возврата функции в виде операции взятия адреса (несмотря на то, что метод класса GraphicsService::getHeight был одинаково объявлен и в заголовке, и в основном модуле), пример:
Q030. Предупреждение «Not targeting the latest versions of Android…»
Иногда при смене настроек android:targetSdkVersion появляется предупреждение «Not targeting the latest versions of Android; compatibility modes apply. Consider testing and updating this version. Consult the android.os.Build.VERSION_CODES javadoc for details.AndroidManifest.xml /ИмяПроекта line 6 Android Lint Problem».
Предупреждение генерирует система Android Lint. Она сообщает о том, что режим совместимости будет применен к тем функциям, которые возможно стали недоступны в более свежих версиях, чем указано в targetSdkVersion.
Объяснение проблемы следующее: когда Ваше приложение работает на версии Android более свежей, чем задано в Вашем targetSdkVersion, различные режимы совместимости будут выключены. Такое поведение гарантирует, что Ваше приложение будет работать, однако это может выглядеть неуместным. Например, если targetSdkVersion указано меньше 14, то Ваше приложение может получить в интерфейсе пользователя кнопку настройки опций.
Чтобы исправить эту проблему, установите значение targetSdkVersion в самое высокое доступное значение. Затем протестируйте приложение, чтобы убедиться, что все возможности работают корректно. Можно проконсультироваться по теме проблем совместимости и узнать, какие произошли изменения при переходе по версиям по ссылке http://developer.android.com/reference/android/os/Build.VERSION_CODES.html. При исправлении этого предупреждения путем увеличения версии android:maxSdkVersion нужно помнить о том, что если к примеру установлено android:maxSdkVersion=»17″, и пользователь обновил свою систему Android на версию больше, чем 17, то Ваше приложение будет автоматически удалено, потому что оно будет относиться к неподдерживаемой версии.
См. также:
Android Min SDK Version vs. Target SDK Version Difference between «Build Target SDK» in Eclipse and android:targetSdkVersion in AndroidManifest.xml?
Q031. Type ‘EGL_DEFAULT_DISPLAY’ could not be resolved
Эта ошибка возникает потому, что в Eclipse не задано макроопределение __ ANDROID__, что приводит к не заданному EGLNativeDisplayType в EGL/eglplatform.h, что в результате приводит к ошибке, что не определено EGL_DEFAULT_DISPLAY.
Чтобы исправить ошибку, зайдите в свойства проекта, перейдите в раздел C/C++ General -> Paths and Symbols, и на закладке Symbols кликните на GNU C, затем на кнопке «Add», и введите __ANDROID__ в поле имени «Name». Поставьте галочки «Add to all configurations» и «Add to all languages», и нажмите OK.
Q032. Как определить версию Android SDK, которая установлена на компьютере?
Перейдите в папку, где у Вас установлен Android SDK, открыв путь %ProgramFiles%AndroidAndroid-sdkplatforms (если SDK был установлен вместе с Android Studio, то это может быть путь наподобие %ProgramFiles%Androidandroid-studiosdkplatforms). В папке platforms вы найдете подпапки от android-3 до android-19, это и есть установленные SDK для различных версий платформ Android.
Можно также узнать установленные версии SDK, запустив SDK Manager (см. вопрос Q016). Когда SDK Manager запустится, в разделе Installed packages Вы можете найти информацию об SDK. Кроме того, в среде Eclipse можно открыть окно Help -> Install New Software…, и открыть ссылку What is already installed? в правой нижней части окна. То же самое окно можно открыть через Help -> About Eclipse -> Installation Details.
В проекте Eclipse строка Build.VERSION.RELEASE даст Вам строку, удобочитаемую для пользователя, которая предоставит информацию о версии (например 1.5, 1.6, 2.0), в то время как Build.VERSION.SDK_INT даст числовое значение из Build.VERSION_CODES, которое удобнее использовать программно — например для сравнения версий.
Q033. Ошибка NDKHelper.java: PROPERTY_OUTPUT_FRAMES_PER_BUFFER cannot be resolved or is not a field
Зайдите в свойства проекта, затем в раздел Android, и в окне Project Build Target поставьте галочку на API Level уровня 17 (Android 4.2.2), нажмите OK.
В общем случае все проблемы, связанные с проверкой в условных операторах переменной SDK_INT (или android.os.Build.VERSION.SDK_INT) решаются увеличением версии API Level в свойствах проекта. Причем вовсе необязательно, что программа, скомпилированная на высоком уровне API Level, не будет работать на младших устройствах Android — все зависит от вызовов API, которая делает программа. Для этого программа должна во время выполнения проверять значение текущего API Level, и в соответствии с уровнем API предпринимать нужные действия.
Q034. Error retrieving parent for item: No resource found that matches the given name …
Это ошибка системы Android AAPT. Ошибка исчезнет, если в файле AndroidManifest.xml увеличите значение атрибута android:minSdkVersion.
[140309]
Q035. Как в приложении Eclipse писать и использовать код не на Java, а на C/C++?
NDK -> создание на C библиотеки, размещение в ней функций -> Объявление этих функций (public native …) в классе MyActivity приложения -> Загрузка созданной библиотеки по имени в классе MyActivity (System.loadLibrary(«mylib»)) -> Вызов функций из кода Java.
Подробнее хорошо написано в книге «Android NDK. Разработка приложений под Android на C/C++», автор Сильвен Ретабоуил.
Q036. Ошибка «Cannot run program «ndk-build»: Launching failed»
Как исправить: свойства проекта -> слева выберите раздел C/C++ Build -> на закладке Builder settings введите полный путь до утилиты ndk-build:
${ANDROID_NDK}ndk-build.cmd
Q037. Различные проблемы с запуском javah.exe и методы их решения.
1. Корректно указывайте имя для Activity в командной строке. Имя должно составляться таким образом: com.имя_проекта_в_нижнем_регистре.имя_Activity, например:
В этом примере MainActivity можно узнать из файла MainActivity.java, который находится в корне проекта. См. в этом файле строку объявления класса Activity наподобие:
public class MainActivity extends Activity
2. В опциях javah.exe все пути с пробелами должны быть указаны в кавычках, например:
В этом примере переменная окружения %ANDROID_SDK% содержит пробелы, поэтому для формирования пути с участием этой переменной нужно использовать двойные кавычки.
3. Ошибка «Error: no classes specified» или «Could not find class file for ‘com.myproject.MainActivity'». Вы не указали в опции -classpath, где находятся классы Вашего приложения. Обычно это папка имя_проектаbinclasses. Вот пример содержимого опции:
4. Ошибка «Error: cannot access android.app.Activity», «class file for android.app.Activity not found». В пути опции -classpath через точку с запятой нужно добавить путь до файла android.jar, относящегося к целевой платформе, для которой Вы компилируете приложение. Например, если Вы делаете приложение для Android 4.1.2 (API Level 16), то это будет файл %ANDROID_SDK%platformsandroid-16android.jar. Переменная окружения %ANDROID_SDK% указывает на каталог, где находится SDK (к примеру, это может быть папка c:Program FilesAndroidandroid-studiosdk). Вот пример командной строки строки javah.exe с указанием целевого android.jar:
Q038. Как в Eclipse настроить запуск javah.exe для генерации заголовочного файла моего модуля на C/C++?
Процесс по шагам:
a) Run -> External Tools -> External Tools Configurations…, откроется окно для настройки конфигураций запуска внешнего инструментария компиляции.
b) Слева щелкните на раздел Program, добавьте новую конфигурацию кнопкой New launch configuration. В поле Name укажите любое произвольное имя, например MyProject javah.
c) В поле Location: укажите полный путь для запуска утилиты javah.exe. Не стесняйтесь пользоваться кнопкой Variables…, которая позволяет использовать изначально настроенные переменные. В этом примере используется env_var для распаковки пути до места расположения каталога JDK через переменную окружения JAVA_HOME. Пример пути до javah.exe: ${env_var:JAVA_HOME}binjavah.exe
d) В поле Working Directory: укажите путь до рабочей директории. Обычно это папка bin, расположенная в корневом каталоге проекта. Пример указания рабочего каталога: ${workspace_loc:/MyProject/bin}
e) В поле Arguments: укажите аргументы для запуска утилиты javah.exe. Здесь должны быть указаны опция -classes (пути, где расположены классы проекта), опция -d (задает рабочий каталог), и имя для Activity приложения. Пример указания аргументов javah.exe: -classpath «${workspace_loc}»/MyProject/bin/classes;»${env_var:ANDROID_SDK}»platformsandroid-16android.jar -d «${workspace_loc:/MyProject/jni}» com.myproject.MainActivity
f) Перейдите на закладку Refresh, поставьте галочку Refresh resources upon completion, выберите радиокнопку Specific resources и через кнопку Specify Resources… укажите на каталог jni, где будет размещаться модуль C/C++, для которого javah.exe должна генерировать заголовок.
Q039. Где меняются настройки, связанные с платформой (API Level) компилируемого приложения?
Настройки меняются во многих местах:
1. Имя проекта -> Properties -> Android -> поставьте галочку на выбранную версию Android (например Android 4.1.2, API Level 16). 2. Имя проекта -> Properties -> C/C++ General -> Paths and Symbols -> Includes -> настройте пути поиска заголовочных файлов Android NDK. Пример настроенных путей для Assembly, GNU C, GNU C++: ${ANDROID_NDK}/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/lib/gcc/arm-linux-androideabi/4.8/include ${ANDROID_NDK}/sources/android/native_app_glue ${ANDROID_NDK}/platforms/android-16/arch-arm/usr/include 3. AndroidManifest.xml -> android:minSdkVersion=»16″, android:targetSdkVersion=»16″. В этом примере настроено использование SDK для API Level 16.
[140315]
Q040. Java: что такое Direct Subclass, Indirect Subclass?
Часто в документации по программированию Android встречаешь списки типа «Known Direct Subclasses», «Known Indirect Subclasses», однако что это на самом деле значит?
Direct Subclass — класс, который является прямым, непосредственным производным от какого-то класса. Indirect Subclass — класс, который является наследником какого-то класса через цепочку промежуточных наследников.
Например, есть следующая иерархия наследования классов (для Java-класса TextView):
Для получения строки можно использовать либо getString(int), либо getText(int). Функция getText(int) возвратит вместе с текстом стили и форматирование, которые применены к строке.
Q043. Java: как добавить к String строку?
. Предположим, есть строка «Это строка 1», как добавить к этой строке другую строку «Это строка 2»?
Для этой цели можно использовать класс StringBuilder. Пример:
Кроме StringBuilder можно также использовать StringBuffer. Оба этих класса используют для динамической манипуляции строками. Однако нужно помнить, что StringBuffer является thread-safe (можно безопасно использовать в многопоточной среде), а StringBuilder не thread-safe (можно безопасно использовать только в одном потоке). Поэтому в одном потоке используйте StringBuilder, поскольку он работает быстрее, чем StringBuffer.
Q044. Java: как преобразовать CharSequence в String?
Используйте метод toString, который есть у всех классов (в том числе и у класса CharSequence).
Q045. Java: как программно работать с визуальными компонентами интерфейса приложения? Что означает @+id?
Этот вопрос частично пересекается с вопросом Q042, где рассматривалось получение строки из ресурсов, а также с вопросом Q009, где объяснялось назначение файла класса ресурсов R.
Все ресурсы приложения Android (к ресурсам относятся все визуальные компоненты приложения, кнопки, галочки, слайдеры, метки, строки и т. п.) конфигурируются с помощью файлов XML, которые размещены в папке res (и распределены по подпапкам layout, menu). Из всех файлов XML, где описаны ресурсы, система Eclipse автоматически генерирует файл R, это файл класса ресурсов приложения, при этом каждый ресурс получает уникальный числовой идентификатор id. Получить доступ к ресурсу (запросить значение строки, создать объект класса, который соответствует контролу ресурса) можно с помощью этого id и соответствующих функций, которые принимают id в качестве параметра. Пример получения строки из ресурса уже был рассмотрен в вопросе Q042.
По такому же принципу, как было показано в вопросе Q042, работают со всеми ресурсами: создается объект, который соответствует ресурсу, и уже работают с методами этого объекта.
Теперь по поводу того, что же такое «@+id». С цифровыми идентификаторами, которые присвоены каждому ресурсу в файле R, конечно же работать неудобно. Поэтому каждому цифровому id поставлено в соответствие символическое имя, которое редактируется в свойстве Id, и задается в виде текста «@+id/текстовое_имя_ресурса». Плюсик означает, что должен быть создан новый ID, которому система сама назначит цифровое значение, поставленное в соответствие символическому имени ресурса «текстовое_имя_ресурса» (это соответствие автоматически генерируется и хранится в файле R).
Когда в визуальном редакторе Eclipse редактируют будущий вид приложения, то добавляют туда разные контролы (контролы это кнопки, текстовые метки, галочки и т. п.). После добавления каждого контрола в свойстве Id для удобства задают текстовый идентификатор @+id. Рассмотрим пример программной работы с интерфейсом приложения на метке TextView. Ресурсом TextView (текстовая метка) размещен визуальным редактором на экране разрабатываемого приложения, и в свойстве Id задано имя mylabel, что показано на скриншоте:
Имя идентификатора, которое через слеш добавляется к @+d, потом попадает в файл activity_main.xml. Для нашего примера с меткой TextView (показан фрагмент файла activity_main.xml):
Далее по имени mylabel можно программно работать с контролом TextView:
//Получим размеры экрана устройства Android.
Display display = getWindowManager().getDefaultDisplay();
Point size =new Point();
display.getSize(size);int width = size.x;int height = size.y;//Загрузим контрол TextView из ресурсов и установим// его размер во весь экран.
TextView text =(TextView)findViewById(R.id.mylabel);
text.setWidth(width);
text.setHeight(height);//Вставка своего текста в TextView
text.setText(R.string.str1);//Добавление текста к TextView
consoletxtval = text.getText().toString();
StringBuilder stringBuilder =new StringBuilder(consoletxtval);
stringBuilder.append("n");
stringBuilder.append(getString(R.string.str2));
consoletxtval = stringBuilder.toString();
text.setText(consoletxtval);
[140323]
Q046. Java: как выводить сообщения в LogCat?
LogCat это системный лог сообщений. Разработчик может выводить туда свои сообщения с помощью статического класса android.util.Log. Сделайте импорт android.util.Log, и далее пользуйтесь его методами без создания экземпляра класса (поскольку класс статический).
LogCat поддерживает разные уровни вывода сообщений:
V — Verbose (подробно, самый низкий приоритет)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (самый высокий приоритет, на котором ничто никогда не распечатывается)
Благодаря наличию уровней сообщений их можно грубо отфильтровать по уровню. Например, вот так это делается в консоли LogCat в среде Eclipse:
Когда Вы запускаете свое приложение в режиме отладки из Eclipse, то Вы можете увидеть множество сообщений, которые появляются в окне консоли LogCat: как сообщения, отправленные Вашим приложением, так и сообщения системы и других приложений, которые работают в этот момент на Вашем устройстве.
Чтобы вывести что-то в лог, сначала определитесь, насколько критичным должно быть выводимое сообщение (должно ли оно быть в категории отладочной информации (d, Debug), или это должно быть просто информационное сообщение (i, Info), или это должно быть предупреждение (w, Warning) или это должно быть сообщение об ошибке (e, Error)? После этого используйте для вывода подходящий метод:
Первый параметр myApp предоставляет текстовую метку, которая позволяет дополнительно отфильтровать сообщения в логе. Это может оказаться полезным, когда сообщений слишком много, и найти нужное сообщение будет проще, если заранее знать её метку. В консоли LogCat Eclipse такой фильтр можно создать кнопкой с зеленым плюсиком «Add new logcat filter».
Примечание: после отладочного запуска приложения в Eclipse один такой фильтр создается автоматически по имени пакета приложения. В этот фильтр попадут сообщения, которые система Android сама сгенерирует в ответ на события, относящиеся к Вашему приложению.
Q047. C/C++: как выводить сообщения в LogCat?
Для native-кода NDK предоставляет библиотеку, аналогичную Java-классу android.util.Log. Чтобы воспользоваться её возможностями, подключите заголовочный файл log.h
#include < android/log.h >
и в файл Android.mk добавьте строку
LOCAL_LDLIBS:= -landroid -llog
После этого для вывода в LogCat можете использовать функции __android_log_vprintf и __android_log_printf. Однако эти функции напрямую вызывать достаточно неудобно, поэтому есть смысл создать для них специальный класс Log:
Q048. Как сделать сделать полноэкранное приложение?
Для игр часто нужно создать программу, которая работает в полный экран, даже без отображения заголовка оповещений (notification bar). Есть несколько способов решения этой задачи.
[Программное отображение в полный экран]
Вот код, который позволяет загружать Activity в полный экран.
Имейте в виду, что вариант с манифестом может привести к загрузке приложения с отображением черного экрана, так что иногда программный вариант переключения в полный экран может быть предпочтительней.
Q049. Запуск MediaPlayer для воспроизведения звука приводит к ошибкам «prepareAsync called in state 1», «start called in state 1».
Причина в том, что на момент вызова метода start() экземпляр MediaPlayer еще не готов к воспроизведению. Запускать воспроизведение можно только при полной готовности MediaPlayer.
Отслеживание готовности можно в обработчике события setOnPreparedListener класса MediaPlayer:
//Объект проигрывателя, который будет проигрывать звук на кнопке.
MediaPlayer mp = MediaPlayer.create(this, R.raw.girlfart01);//Звук будет проигрываться только 1 раз:
mp.setLooping(false);//Установка обработчика события на момент готовности проигрывателя:
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){publicvoidonPrepared(MediaPlayer player){//При готовности к проигрыванию запуск вывода звука:
player.start();}});
Подробнее про воспроизведение звука с помощью MediaPlayer см. статью «MediaPlayer: проигрывание звука».
[140415]
Q050. Как рисовать на экране приложения графику и текст?
Текст и графика рисуются с помощью объектов Canvas и Paint. Пример рисования текста:
Q051. Как вывести многострочный текст с прокруткой?
Для этого можно использовать классы TextView и EditText.
[Использование TextView]
1. Добавьте на форму программы виджет TextView. Это можно сделать в графическом редакторе формы, выбрав виджет в разделе Form widgets. После добавления виджета в файле activity_main.xml добавятся строки:
Здесь важно запомнить значение идентификатора виджета android:id (в нашем примере идентификатор textView1), он нам понадобится в дальнейшем для подключения к виджету в программе. Атрибут android:text можно убрать, так как начальный текст нам не нужен.
Чтобы окно с текстом занимало всю доступную область, добавьте также атрибуты:
3. Чтобы добавить текст в поле редактирования, вызовите метод append:
txtconsole.append("Это мой текстrn");
В этом примере в конец текста добавлены символы CR и LF, чтобы следующий текст отображался с новой строки. Тест будет добавляться, пока не дойдет до заполнения формы и не будет теряться снизу, чтобы этого не было, нужно добавить вертикальную полосу прокрутки.
4. Чтобы добавить справа вертикальную полосу прокрутки, в секцию TextView файла activity_main.xml добавьте атрибут android:scrollbars=»vertical»:
5. Чтобы было проще добавлять текст в TextView, и сразу его прокручивать в конец при добавлении нового текста, целесообразно написать для этого отдельную процедуру:
1. Добавьте на форму программы виджет Plain Text. Это можно сделать в графическом редакторе формы, выбрав виджет в разделе Text Fields (он помечен меткой abc). После добавления виджета в файле activity_main.xml добавятся строки:
Здесь важно запомнить значение идентификатора виджета android:id (в нашем примере идентификатор editText1), он нам понадобится в дальнейшем для подключения к виджету в программе.
2. Добавьте в класс Activity приложения глобальную переменную с типом EditText:
EditText txtconsole;
В обработчике onCreate Activity добавьте инициализацию переменной:
Директива #define теперь не работает, потому что прекомпилятор как таковой отсутствует. Константы на Java нужно задавать так же, как и обычные переменные, но только с добавлением ключевого слова final (оно означает, что константе можно присвоить значение только 1 раз).
//Стандартный синтаксис #define на языке C/C++:#define USB_TYPE_VENDOR (0x02 << 5)#define USB_RECIP_DEVICE 0x00#define USB_ENDPOINT_IN 0x80#define USB_ENDPOINT_OUT 0x00
//Те же самые константы на Java нужно задавать так:publicclassMainActivityextends Activity
{privatestaticfinalint USB_TYPE_VENDOR =(0x02<<5);privatestaticfinalint USB_RECIP_DEVICE =0x00;privatestaticfinalint USB_ENDPOINT_IN =0x80;privatestaticfinalint USB_ENDPOINT_OUT =0x00;...
Q055. Eclipse: ошибка «Unable to resolve target»
Такая ошибка может возникнуть после импорта готового проекта в текущий воркспейс. После импорта проекта в Eclipse любые глюки не редкость, так что удивляться не нужно (кстати говоря, многие глюки устраняются просто перезапуском Eclipse).
Когда в свойствах старого проекта (файл project.properties) указан target на версию, которая не поддерживается текущей установкой Eclipse, то попытка очистки (Project -> Clean…) может вызвать такую ошибку. Исправить ошибку можно, если поменять версию target. Там нужно указать число API Level, например:
# Project target.
target=android-19
Q056. Можно ли выводить в TextView форматированный текст (bold, italiс и т. п.)?
В виджете TextView Android есть недокументированная возможность выводить тест в формате HTML, т. е. текст можно делать подчеркнутым, толстым, и даже вставлять в TextView ссылки. Это делается с помощью класса Html и его метода fromHtml. Пример вывода форматированного текста:
String s ="< b >Жирный< /b >, < i >наклонный< /i >, и даже < u >подчеркнутый< /u > текст!"
TextView tv =(TextView)findViewById(R.id.THE_TEXTVIEW_ID);
tv.setText(Html.fromHtml(s));
Такая возможность появилась начиная с Android 2.1, поддерживаются также теги: a href=»/…», b, big, blockquote, br, cite, dfn, div align=»…», em, font size=»…» color=»…» face=»…», h1, h2, h3, h4, h5, h6, i, img src=»/…», p, small, strike, strong, sub, sup, tt, u.
Внимание: если есть необходимость добавления форматированного текста к уже имеющемуся в TextView без потери его форматирования, то необходимо предусмотреть отдельный буфер для текста типа String, и хранить весь форматированный текст именно в этом буфере.
Q057. Java: как удалить все элементы выпадающего списка Spinner?
Удалить все записи из виджета Spinner можно с помощью метода setAdapter, если ему передать аргумент null, пример:
mySpinner.setAdapter(null);
[140428]
Q058. Как вызвать функцию getSystemService из любого класса?
Если вызвать getSystemService из класса, который не связан с GUI приложения Android (т. е. не из класса, который порожден от Activity), то компилятор Java выдаст ошибку «метод не определен». Это происходит потому, что getSystemService связан с классом Context, от которого произведен класс Activity. В произвольном классе, который по умолчанию порожден от класса Object, нет доступа к Context и к его методу getSystemService.
Чтобы иметь возможность вызвать getSystemService из любого класса, нужно передать в него Context. Это можно сделать разными способами — через параметр конструктора, через статическую переменную класса.
[Передача Context через конструктор класса]
publicclassmyClass {
Context mContext;//Инициализация контекста в конструкторе.publicmyclass(Context mContext;){this.mContext= mContext;}public Location getLocation(){//Есть возможность вызвать getSystemService через Context:
locationManager =(LocationManager)mContext.getSystemService(context);...}} publicclassMainActivityextends Activity
{
Button btnCheck;
myClass myclass;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnCheck =(Button)findViewById(R.id.checkusbdev);//Передача контекста в экземпляр myClass:
myclass =new myClass(this);...}...}
[Передача Context через статическую переменную класса]
//В класс usbutil будет передаваться Context из класса Activitypublicclassusbutil{publicstatic MainActivity context =null;publicstatic String doReadRawDescriptors(UsbDevice device,int paramidx){//Теперь есть возможность вызвать getSystemService через Context:
UsbManager manager =(UsbManager)context.getSystemService(Context.USB_SERVICE);
UsbDeviceConnection connection = manager.openDevice(device);...}...}publicclassMainActivityextends Activity
{
Button btnCheck;
Spinner spDeviceName;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnCheck =(Button)findViewById(R.id.checkusbdev);...//Передача контекста в класс usbutil:
usbutil.context=this;...}...}
Q059. Eclipse: как заменить форматирование кода с табуляции на пробелы?
Вопрос не очень тривиальный, поскольку требует замены настроек во многих местах. Процесс по шагам для настроек форматирования кода Java:
1. Поменяйте свойства редактора кода Java: меню Window -> Preferences -> Java -> Code Style -> Formatter -> Edit -> Indentation выберите из списка «Spaces Only». Для того, чтобы можно было сохранить настройки, создайте новый профиль, для этого вверху в строке ввода Profile name введите имя нового профиля.
2. Поменяйте свойства редактора по умолчанию: меню Window -> Preferences -> General -> Editors -> Text Editors -> Insert spaces for tabs поставьте галочку.
3. Для уже имеющегося файла Java, в коде которого есть Tab-ы, нужно принудительно поменять все Tab-ы на пробелы. Если этого не сделать, то даже при измененных настройках (на шагах 1, 2) добавление новых строк и операторов будет выполняться все так же с Tab-ами вместо пробелов. Чтобы быстро поменять все Tab на пробелы откройте файл, нажмите Ctrl-A (выделится весь текст) и затем нажмите Ctrl-I (применятся текущие настройки форматирования Ident). Это заменит в тексте все символы табуляции на пробелы. Дальше добавление новых строк, блоков кода будет происходить уже нормально, с пробелами.
См. также How do I change Eclipse to use spaces instead of tabs? site:stackoverflow.com.
Q060. Eclipse: как заменить «египетский» стиль блоков кода на традиционный? Чтобы фигурная скобка открывалась не в конце оператора, а на новой строке?
//Есть "египетский", нечитаемый код:if(myclass.enabled()){
myclass.doSomething();}else{
myclass.doSleep();} //Нужно, чтобы был нормальный:if(myclass.enabled()){
myclass.doSomething();}else{
myclass.doSleep();}
Для того, чтобы изменить оформление блоков кода, нужно отредактировать шаблоны кода, и создать новый форматер для кода. Как то делается на примере кода Java:
1. Меню Window -> Preferences -> Java -> Editor -> Templates, выберите в таблице нужную строку с шаблоном и нажмите кнопку Edit. Отредактируйте шаблон так, чтобы фигурная скобка появилась на новой строке. Повторите то же самое для всех шаблонов, где встречается блок с фигурными скобками.
2. Создайте новый форматер и примените его. Для этого зайдите в меню Window -> Preferences -> Java -> Code Style -> Formatter. Нажмите кнопку Edit, в строке ввода Profile name введите имя нового профиля (например Normal).
3. На закладке Braces во всех выпадающих списках Brace positions выберите вариант Next line.
4. На закладках New Lines и Control Statements расставьте галочки так, чтобы оформление кода соответствовало Вашим ожиданиям.
Q061. Eclipse: как ставить закладки в коде, и как делать навигацию по закладкам?
Работа с закладками сделана не так удобно, как в Visual Studio, но работать можно.
1. Закладка добавляется через меню View -> Add Bookmark…, в коде при этом на слева от строки, где стоит закладка, прикрепляется синий флажок. 2. Удалить закладку можно через контекстное меню закладки, щелкните правой кнопкой на закладку в коде и выберите Remove Bookmark. Удалять закладки можно также через просмотр закладок (вид Bookmarks). 3. Через консоль просмотра закладок можно делать навигацию по закладкам. Чтобы открыть консоль закладок, войдите в меню Window -> Show View -> Other… -> General -> Bookmarks. В нижней части окна добавится консоль Bookmarks (среди консолей Problems, Javadoc, Declaration, Console, LogCat). 4. Для добавления закладок удобно привязать неиспользуемую горячую клавишу (через меню Windows -> Preferences -> General -> Keys). Я привязал себе для добавления закладок комбинацию Ctrl+B, предварительно отвязав её от действия по умолчанию Build all.
[140430]
Q061. Java: как закодировать дату в формате yymmdd?
Формат предоставления даты в виде YYMMDD (сначала 2 цифры года, потом 2 цифры месяца и 2 цифры дней) удобен для подставления в виде префикса к именам файлов — чтобы файлы были автоматически рассортированы по дате. Но как в Android закодировать дату в текстовое представление YYMMDD?
Оказывается, что это несложно, если использовать класс SimpleDateFormat. Вот пример функции, которая получает текущую дату и форматирует её в виде YYMMDD:
publicstatic String YYMMDD(){
String result =null;try{
Date currDate =new Date();
result =new SimpleDateFormat("yyMMdd").format(currDate);}catch(Exception e){
Toast.makeText(context,"YYMMDD: "+ e.toString(),
Toast.LENGTH_LONG).show();}return result;}
[140502]
Q062. Java: как получить беззнаковое значение байта?
Как известно, в Java не предусмотрено использование чисел без знака. Если Вам нужно сохранить байт на диск как есть, то это не создаст проблему. Однако если нужно интерпретировать значение байта, и производить над ним математические вычисления как с беззнаковым числом, то его нужно перевести в число int с помощью операции AND с числом 0xFF. Пример:
При преобразовании беззнакового байта в int мы сначала преобразуем в байт в int с получением числа с сохранением знака. Это преобразование происходит с учетом знака, где самый старший значащий бит (Most Significant Bit, MSB) представляет знак, и он будет задублирован в остальных битах полученного целого числа.
byte b = readAByteFromDisk();int i =(int)b;
Вот что получится, когда преобразуется беззнаковый байт со значением 219:
11011011 = unsigned byte 219
^ signed byte -37
|_________ Most Significant Bit
11111111 11111111 11111111 11011011 = signed int -37
^
|____________________________________ расширение числа при создании int
Затем на число int i накладывается маска с побитным оператором AND. Это сбросит все дополнительные биты и знаковое расширение числа, которые появились при преобразовании байта в число int.
int i =0x000000FF& i;
11111111 11111111 11111111 11011011 = signed int -37
00000000 00000000 00000000 11111111 = Маска 0x000000FF
00000000 00000000 00000000 11011011 = Результат операции &
Мы использовали шестнадцатеричное число 0x000000FF (в десятичном виде 255) как маску, потому что она оставит младшие 8 числа int, это как раз та часть числа, что нас интересует. Вся функция может быть записана проще и сведена к одному короткому оператору. Значение байта, когда оно используется вместе с оператором &, будет автоматически преобразовано в число int. Шестнадцатеричное значение 0x000000FF может быть записано как 0xFF (дополнительные нули слева добавляются автоматически для дополнения до числа с размером int).
int i =0xFF& readAByteFromDisk();
[140505]
Q063. Eclipse: новый проект не создается (Unhandled event loop exception)
Симптомы:
1. Создать новый проект «Android Application Project» невозможно, если в процессе создания в мастере установить галочку Create custom launcher icon. При этом не видны зеленые иконки разных размеров в правом окошке Preview. Мастер создания проектов не завершается, в логе выводится ошибка «Unhandled event loop exception». Если принудительно завершить мастер, то Проект не создается полностью. При попытке clean или Build выскакивает ошибка «Errors occurred during the build. Errors running builder ‘Android Resource Manager’ on project ‘USBrelay’. java.lang.NullPointerException». 2. Если снять галочку Create custom launcher icon, то проект создается нормально. 3. Невозможно добавить к проекту иконку запуска launcher icon. 4. Переустановки (Eclipse как отдельно, так и составе ADT Bundle) и обновления не помогают.
Условия воспроизведения ошибки: Host OS: Windows XP SP 2002 SP3 (32-bit), SDK tools version 22.6.3, Eclipse version: 4.3.1.v20130911-1000 из пакета ADT Bundle (Android Developer Tools Build: v22.6.2-1085508), ADT plug-in version: 22.6.2v201403212031-1085508.
Проблема оказалась в версии JDK (Java) 1.7.0_45. На версиях 1.6.0_13 и 1.8.0_05 проблема не наблюдается.
Q064. Eclipse: открытие activity_main.xml приводит к ошибке org.eclipse.swt.SWTException
Полный текст ошибки: An error has occurred. See error log for more details. org.eclipse.swt.SWTException: Widget is disposed.
Устранить ошибку можно перезагрузкой Eclipse, а также запуском из командной строки eclipse -clean.
Q065. Eclipse, Android: почему в onCreate методы getLeft, getTop и т. п. для виджетов возвращают 0?
Причина в том, что обработчике onCreate форма программы еще не отрисована, и координаты виджетов на форме пока неизвестны.
Устранить ошибку можно, если вычислять размеры виджетов и их позицию во время событий, которые возникают после onCreate.
[140507]
Q066. Java: как разделить строку на подстроки по пробелу или другому символу?
int intVal =2;
String text;//Следующая строка даст ошибку UnknownFormatConversionException:
text = String.format("%i", intVal);
Причина тут в недопустимой опции преобразования %i, вместо неё на Java нужно использовать %d:
text = String.format("%d", intVal);//ОК
Вот таблица поддерживаемых спецификаторов формата:
Преобразование
Описание
b,B
boolean
h,H
hash code
s,S
string
c,C
character
d
decimal integer
o
octal integer
x,X
hexadecimal integer
e,E
floating point in scientific notation
f
floating point in decimal notation
g,G
floating point in either decimal or scientific notation
a,A
hexadecimal floating point
t,T
date/time
%
percent
n
line terminator
Q069. почему строки String не получается сравнивать оператором == ?
А на C# так сравнивать можно, почему на Java это не работает?
Причина в реализации оператора == для строк на Java. На Java оператор == сравнивает ссылки на объекты строк, а не сами строки. Чтобы сравнивать строки на Java, используйте метод equals:
Причина в том, что getInteger не делает парсинг строки и преобразование её в целое число (как Вы могли бы предположить по названию метода). Вместо этого getInteger возвращает целочисленное значение системного свойства по указанному имени. Если системное свойство не найдено, или свойство не имеет корректного числового формата, то будет возращен null.
Чтобы получить число из текстового представления, используйте метод Integer.parseInt (см. вопрос Q052).
Q071. Где находятся сохраненные скриншоты на Android?
Если атрибут launchMode не задан, то по умолчанию используется значение standard.
Когда используется
Режим запуска
Несколько activity?
Комментарий
Обычно используется для запуска большинства activity
«standard«
Да
Значение по умолчанию. Система всегда создает новый экземпляр activity в целевой задаче (target task) и направит к нему intent.
«singleTop«
Зависит от условий
Если уже существует экземпляр activity поверх целевой задачи (target task), система перенаправит intent к этому экземпляру вызовом метода onNewIntent(), вместо того чтобы создавать новый экземпляр activity.
Специальные запуски (не рекомендуется для обычного использования)
«singleTask«
Нет
Система создает activity в корне новой задачи и перенаправляет к ней intent. Однако, если экземпляр activity уже существует, то система перенаправляет intent к существующему экземпляру вызовом его метода onNewIntent(), вместо того чтобы создавать новый экземпляр.
«singleInstance«
Нет
То же самое, что и «singleTask", за исключением того, что система не будет запускать любые другие activity в задаче, которая владеет экземпляром уже работающей activity. В этом случае activity всегда одна, и только она может быть членом своей задачи.
Q073. Что такое суперкласс (superclass)? Что такое вызов метода суперкласса?
Суперкласс — это родитель, от которого произошел класс. Т. е. для дочернего класса класс-родитель является суперклассом. Дочерний класс наследует методы суперкласса, и вызов метода класса-родителя называется вызовом метода суперкласса.
Самый распространенный пример — когда при создании проекта программы создается класс активности, порожденный от класса Activity (помните? public class MainActivity extends Activity). Если нужно вызвать метод класса Activity, то в дочернем классе вызов его метода будет называться вызовом метода суперкласса, и должно сопровождаться префиксом super. Пример вызова метода суперкласса onResume в методе класса:
Q074. Почему BroadcastReceiver не отслеживает события подключения устройства USB (ACTION_USB_DEVICE_ATTACHED)? События отключения ACTION_USB_DEVICE_DETACHED при этом отслеживаются нормально.
Это известный баг «Issue 25703: USB host device plugin notification failure», который во многих Android не исправлен. Как его обойти, описано в статье «Определение событий подключения и отключения устройств USB».
Q075. Как подключаться к adb через TCP/IP (например, через WiFi)? Это иногда полезно, когда интерфейс USB занят или отсутствует.
[Подключение вручную, если получены права root на Android]
Вы можете разрешить подключение к Android через WiFi следующими командами (в терминале на самом Android):
su
setprop service.adb.tcp.port 5555
stop adbd
start adbd
Отключить коннект через WiFi и вернуться к подключению adb через USB можно следующими командами:
Права root в этом случае необязательны, но в настройках нужно включить режим отладки, и нужно заранее знать IP-адрес подключенного по WiFi устройства Android. Выполните в cmd следующие команды:
adb tcpip 5555
adb connect 192.168.a.b:5555
Здесь 192.168.a.b адрес IP устройства Android. Вы можете определить IP адрес устройства Android двумя способами:
• Вручную, для чего зайдите в настройки WiFi на Android, выберите Advanced и там будет указан IP. Можно также запустить программу наподобие Ftp Сервер., и она покажет IP адрес устройства Android.
• С помощью команды ADB:
adb shell ip -f inet addr show wlan0
Вернуться к подключению ADB через USB можно командой:
adb usb
[Подключение adb через сеть с помощью специальных программ]
В магазине Google Play есть несколько программ, которые позволяют автоматизировать процесс. Быстрый поиск подскажет такие программы, как adbWireless, WiFi ADB и ADB WiFi. Все эти программы требуют прав root, однако программа adbWireless требует меньше разрешений.
[170219]
Q075. Установили новую версию Java, но все еще запускается старая
Возможные причины проблемы: в папке c:Windows или c:Windowssystem32 находится старая версия. Решение проблемы: зайдите в системные папки Windows (c:Windows, c:Windowssystem32), и удалите оттуда файлы java.exe.
Еще одна причина: работает сервис быстрого запуска Java (Java Quick Starter, исполняемый файл jqs.exe). Решение проблемы: остановите и отключите сервис Java Quick Starter. Если он находится в папке Java старой версии, то удалите папку, где он находится.
Q076. Ошибка … could not open jvm.cfg
Причина ошибки в том, что Вы переключились на другую версию Java, верно настроили пути запуска в переменной окружения Path, удалили каталог со старой версией Java в папке Program Files, но все еще пытается запуститься старая версия, которая почему-то находится в папке c:Windows или c:Windowssystem32. Решение проблемы: зайдите в системные папки Windows (c:Windows, c:Windowssystem32), и удалите оттуда файлы java.exe.
[Ссылки]
1. Что такое API Level? 2. Google USB Driver site:developer.android.com. 3. OEM USB Drivers site:developer.android.com — где найти и как установить драйвер отладки USB именно для Вашего устройства Android. 4. Отладка разрабатываемого приложения Android. 5. Что такое Android rooted device? 6. Android Debug Bridge — что это такое? 7. Словарик Android.