2009-06-05 9 views
7

Voglio portare alcune librerie j2se esistenti (ad esempio le librerie di compressione di Apache) da utilizzare per lo sviluppo di Blackberry, ma c'è un problema (e non solo uno).Downgrade del codice Java 1.5 a 1.4 (punti bonus: J2ME, Blackberry !!!)

In primo luogo, la maggior parte delle librerie java utilizza in modo esteso le raccolte e i tipi di dati j2se che tipicamente mancano sulle piattaforme j2me, ma che è teoricamente risolvibile grazie alle implementazioni open source di j2se api come Apache Harmony. Il problema più grande è che, a quanto pare, Blackberry JDK è basato su java 1.4, quindi qualsiasi codice che usi generici e altre funzionalità di 1.5, come Enums, non è facilmente compilabile su Blackberry.

che solleva una questione interessante se ci sono strumenti o progetti esistenti là fuori che farebbe conversione automatica 1.5-> 1.4, pur sostenendo j2me-imbastardito bytecode :)

Un progetto sono stato in grado di trovare è Retroweaver, ma non sono abbastanza sicuro di quanto sia attivo quel progetto.

Sono sicuro che il problema della conversione automatica 1.5-> 1.4 non è univoco - così come qualcuno ha esperienza con esso?

+1

1.4 non ti darà java da quando "tutte le piattaforme Java ME sono attualmente limitate a JRE 1.3" ([fonte: Wikipedia] (http://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition)) - ad es. , Java ME non ha asserzioni specifiche JDK 1.4 – gnat

risposta

1

Quindi, ecco quello che ho finito per fare finora: Declawer + qualche personalizzato codice per la generazione di classi di enumerazione.

L'unica cosa di differenziazione di Declawer è che, sebbene sia molto semplice e, francamente, un po 'un trucco (si basa su una capacità non documentata di JavaC), il suo output è il codice Java reale rispetto a Java avanzato o convertito bytecode. Questo è molto prezioso per lo sviluppo mobile basato su Java come, francamente, la modifica/strumentazione di bytecode non è affatto sviluppata per le piattaforme j2me come per j2se, e non ci sono garanzie che le cose funzionino fuori dagli schemi lo fanno con j2se dove questi strumenti sono già stati usati da un bel po 'di sviluppatori.

Le funzionalità di Declawer sono limitate (nessun amore per 1,5 enumerazioni o autoboxing), quindi ho dovuto aggiungere uno script python per generare automaticamente classi equivalenti in funzionalità a 1,5 enumerazioni da semplici descrittori. Questa generazione avviene al momento della costruzione.

Questo risolve le mie preoccupazioni finora, con l'unica eccezione di trovare un contenitore CIO buon J2ME-friendly da utilizzare per la mia app (una volta si tenta di questi ragazzi, è così difficile rinunciarvi.)

Ma questa è una discussione per un thread diverso.

2

Ho usato il retroweaver in passato (J2SE, non J2ME) - ha funzionato molto bene. Il costo di utilizzarlo è un paio di dipendenze extra di runtime.

Aggiornamento 2013-01-28: dopo aver riscontrato problemi con RetroWeaver, sono passato a RetroTranslator.

+0

Hai ragione - J2SE (o J2SE JRE?). È venerdì ... :) – ptyx

7

Hai provato Retrotranslator? Ho letto che fa un lavoro migliore di Retroweaver.

+0

è fantastico, grazie! questo sembra avere una documentazione molto migliore di retroweaver. Dovrò giocarci un po ':) –

+0

la mia unica preoccupazione, immagino, è come questi strumenti siano influenzati dalle differenze di bytecode nei file di classe prodotti dalle piattaforme j2me dal compilatore. –

+0

Dato che non posso commentare commenti fatti da altri in un post (non ho ancora 50 reputazione), li posterò qui: - per quanto riguarda la compilazione usando 1.5 per source e 1.4 per target, funzionerà solo se non si usano le funzionalità di 1.5 nel codice (sorprendentemente ha funzionato per i generici, ma posso vedere perché i generici "scompaiono" in fase di esecuzione), quindi non è utile. - Per quanto riguarda altri strumenti che hai trovato, spero che almeno uno ti aiuti con tutti gli aspetti del tuo problema. –

2

Ecco something else ho trovato qui su Stack Overflow:

Compilare con la javac regolare e l'obiettivo di una più vecchia JVM vi darà adeguata bytecode per i medicinali generici almeno

che assolutamente senso cercare .

+1

Non ricordo esattamente, ma penso che i generici siano ok ma enumerazioni/nuove per la sintassi non sono supportate. Potrebbe essere stato risolto in seguito javac, ma al momento ho guardato, era a malapena utilizzabile. Questa è stata una delle ragioni per cui ho finito con l'utilizzo di retroweaver. – ptyx

+1

Sfortunatamente, questo non funziona. javac non accetta una fonte più alta della versione di destinazione, quindi hai semplicemente la possibilità di scegliere tra un errore da compilare e un risultato che non verrà eseguito sulla tua piattaforma di destinazione. –

+1

The Sun "javac" non può fare (non sarà?) Fare questo. Il compilatore di Eclipse "ecj" can. Può essere facilmente integrato in entrambe le attività di compilazione java antav e maven. –

0

Ecco altri due strumenti che ho trovato (collegate da pagina Retrotranslator):