Как бороться с наиболее распространенными классами, отсутствующими в J2ME

13
задан Lena Schimmel 5 July 2010 в 05:56
поделиться

4 ответа

Прошло некоторое время с тех пор, как я задавал этот вопрос, и некоторое время с тех пор, как я нашел хорошее, рабочее решение проблемы, но я забыл вам рассказать.

Моим основным фокусом была Java Collections Framework, которая является частью пакета java.util.

Я наконец-то взял исходный код Suns Java 6.0 и скопировал все классы, принадлежащие к фреймворку Collections, в свой собственный проект. Это был проект Java 6.0, но в качестве classpath я использовал банки из J2ME. Большинство тех классов, которые я скопировал, зависят от других классов J2SE, поэтому есть нарушенные зависимости. В любом случае, было довольно легко сократить эти зависимости, убрав все, что связано с сериализацией (что не является для меня приоритетом), и внеся некоторые незначительные изменения.

Я скомпилировал все это дело компилятором Java 6, а retrotranslator был использован для переноса полученного байткода обратно на Java 1.2.

Следующая проблема - имя пакета, потому что вы не можете доставить классы из java.util с приложением J2ME и загрузить их - загрузчик классов bootstrap не будет смотреть в jar-файл приложения, другим загрузчикам не разрешается загружать что-то с таким именем пакета, а на J2ME вы не можете определить пользовательские загрузчики классов. Retrotranslator не только конвертирует байткод, он также помогает изменить ссылки на имена в существующем байткоде. Мне пришлось переместить и переименовать все классы в моем проекте, например, java.util.TreeMap стал my.company.backport.java.util.TreeMap_.

Я смог написать настоящее J2ME-приложение во втором проекте Java 6.0, которое ссылалось на обычный java.util.TreeMap, используя общий синтаксис для создания безопасных для типов коллекций, скомпилировать это приложение в байт-код Java 6.0 и запустить его через ретротранслятор для создания кода Java 1.2, который теперь ссылается на my.company.backport.java.util.TreeMap_. Обратите внимание, что TreeMap - это просто пример, на самом деле он работает для всего фреймворка коллекций и даже для сторонних J2SE Jars, которые ссылаются на этот фреймворк.

Полученное приложение может быть упаковано как jar и jad файл, и прекрасно работает как на эмуляторах J2ME, так и на реальных устройствах (проверено на Sony Ericsson W880i).

Весь процесс кажется довольно сложным, но поскольку я использовал Ant для автоматизации сборки, а ретранслятор мне был нужен в любом случае, пришлось потратиться только на установку бэкпорта фреймворка коллекции.

Как было сказано выше, я сделал это почти год назад, и пишу это в основном из головы, поэтому надеюсь, что в этом нет ошибок. Если вас интересуют более подробные сведения, оставьте мне комментарий. У меня есть несколько страниц немецкой документации об этом процессе, которые я могу предоставить, если есть спрос.

12
ответ дан 1 December 2019 в 20:30
поделиться

Мы столкнулись именно с такой ситуацией при разработке zxing . Если J2ME находится в вашем списке целей, это, безусловно, ваш ограничивающий фактор. Мы нацелены на MIDP 2.0 / CLDC 1.1. Если у вас есть подобное требование, вам нужно придерживаться Java 1.2. Языковые функции Java 1.4 определенно отсутствуют (например, assert), и в целом вы не найдете ничего после 1.2 в J2ME.

Мы не использовали внешние библиотеки, но вы могли бы упаковать их в развернутый файл .jar с небольшим беда. Это сделало бы получившийся .jar больше, и это могло быть проблемой. (Тогда вы можете попробовать оптимизаторы / программы сжатия, такие как ProGuard, чтобы смягчить это.)

В итоге я переопределил что-то вроде Collections.sort () и Comparator, поскольку они нам были нужны, а их нет в J2ME. Так что да, вы можете подумать о том, чтобы делать это в некоторых случаях, но только там, где это необходимо.

Мы использовали Vector, Hashtable и массивы, поскольку в J2ME нет другого выбора. Я бы просто использовал их, если у вас нет причин не делать этого, и я думаю, это будет производительность. Теоретически производители JVM уже оптимизируют свою реализацию, но это не значит, что вы не можете сделать что-то лучше ... Думаю, я был бы удивлен, если это того стоит в подавляющем большинстве случаев. Просто убедитесь, что вам действительно нужно это сделать, прежде чем прилагать усилия.

Теоретически производители JVM уже оптимизируют свою реализацию, но это не значит, что вы не можете сделать что-то лучше ... Думаю, я был бы удивлен, если это того стоит в подавляющем большинстве случаев. Просто убедитесь, что вам действительно нужно это сделать, прежде чем прилагать усилия.

Теоретически производители JVM уже оптимизируют свою реализацию, но это не значит, что вы не можете сделать что-то лучше ... Думаю, я был бы удивлен, если это того стоит в подавляющем большинстве случаев. Просто убедитесь, что вам действительно нужно это сделать, прежде чем прилагать усилия.

3
ответ дан 1 December 2019 в 20:30
поделиться

J2ME жесток, и вам просто придется смириться с тем, чтобы обходиться без некоторых тонкостей других платформ. Привыкайте к Hashtable и Vector и пишите свои собственные оболочки поверх них. Кроме того, не допускайте ошибки, предполагая, что J2ME также является стандартным, поскольку JVM каждого производителя может делать вещи совершенно разными способами. Поначалу я бы не стал сильно беспокоиться о производительности, поскольку просто получить корректность в J2ME - достаточно сложно. Можно написать приложение, работающее на J2ME, J2SE и Android, как я это делал, но это требует большой работы. Одно из моих предложений - написать ядро ​​логики вашего приложения и строго придерживаться java.lang, java.util и java.io. В любом месте, где вы собираетесь делать что-то, что может взаимодействовать с платформой, Например, файловая система или сеть, вы можете создать интерфейс, с которым взаимодействует ваш основной код приложения, и у вас есть разные реализации для разных сред. Например, у вас может быть интерфейс, который обертывает HTTP-файлы и использует javax.microedition.io.HttpConnection с J2ME и java.net.HttpURLConnection на Android. Это больно, но если вы хотите, чтобы приложение работало во всех трех средах, это поможет вам. Удачи.

но если вы хотите, чтобы приложение работало во всех трех средах, оно поможет вам в этом. Удачи.

но если вы хотите, чтобы приложение работало во всех трех средах, оно поможет вам в этом. Удачи.

13
ответ дан 1 December 2019 в 20:30
поделиться

Чтобы ответить на часть вашего вопроса, другой библиотекой коллекций будет Javolution , которую можно построить для j2me.

2
ответ дан 1 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: