!SDK pour développer en C et en C++ (avec des
limitations) pour plate-formes mobiles
!http://brew.qualcomm.com
!Avantages
"Plus rapide et plus puissant que JME - accès natif au
hardware
"Meilleure intégration avec OpenGL ES (3D)
"Sockets UDP et TCP disponibles (éventuellement plusieurs)
"Différents modes de commerce (vente unique, location par
mois ou location par nombre d’accès)
"Simulateur complet (gestion de SMS, données GPS,
pilotable automatiquement)
!Inconvénients
"Coût du compilateur et du programme TRUE BREW
(certification)
"Moins répandu que JME surtout en Europe
!"#$%&'($)*+,-./$0,.-*123#$04521,4-$
$ 6*.#$7$8$
!"#$%&'()*%+*,-'*%./!'$0*$1,12%3*1#*4'22*1#*5"$(%,(1.#1$,"%.#*%.*1.!*%++*!'$06*
789:*;15".3*"#*!'#"3.'!*,%*'.-1.$'*('&'.<'*3'.'(1,"%.*+%(*%='(1,%(#>*
#"3.12".3*",#*&12<'*".*!("&".3*?8@A*1.!*1<35'.,".3*!1,1*#'(&"$'#*<=,10'6*
B-'*+%22%4".3*#$(''.#-%,#*"22<#,(1,'*,-'*,)='#*%+*CD*315'#*1&1"21E2'*%.*51##*
51(0',>*789:F/'.1E2'!*!'&"$'#*,%!1)6*
$
$$
'9$06:&!0/$;*<<#-$=>?$@A$
BC$'9$;4B,5#$
'9$06:&!0/$>,."1$=,."1$&42-<$D$
BC$'9$;4B,5#$
B-'*+%22%4".3*,1E2'*#-%4#*,-1,*%.*-1.!#',#*4",-*$%5=1(1E2'*='(+%(51.$'*
GH%,%(%21*IC*8?J8*1.!*K15#<.3*KLM/?NOO*721!'P>*=<E2"#-'(#*1('*1E2'*,%*
=<#-*-"3-'(*=("$'#*E'$1<#'*%+*,-'*-"3-'(*Q<12",)*%+*315'#*51!'*=%##"E2'*E)*1*
.1,"&'*=21,+%(5*2"0'*789:6*R.*#%5'*$1#'#>*,-')*$1.*'&'.*%++'(*315'#*,-1,*1('*
.%,*1&1"21E2'*%.*#2%4'(*".,'(=(','!*=21,+%(5#*2"0'*S1&16*K<E#$("E'(#*1('*4"22".3*,%*
=1)*+%(*,-'#'*-"3-'(*Q<12",)*'T='("'.$'#*1#*4'226*
$
!"#$%
&$'()*+%
,*-*'*."%&/%0120%
34(+5%-6$%7089%4*.:-(*+%
;<'(+-%
;"#4:+5%;=>?1@AA%
7."B$%
$ E-5,+,1#<$ ;4-1"5C$ E-5,+,1#<$ ;4-1"5C$
9FG"*51$H$I)*+#54J1K$ LMNN$ /CD@% =9$ ECD@%
%341"#3F$O-$93+FP$'*3-#<$O-$%544<$
I)*+#54J1K$
@CD@% DMQN$ FC@@% =9$
'9$06:&!0$;*<<#-$=>?$@A$I'9K$ GGCD@% DMQN$ HC@@% =9$
;*FF,R#$0-4SB4*3<,-.$I)*+#54J1K$ TMNN$ DMQN$ =9$ =9$
;,<-,."1$%4S5,-.$I)*+#54J1K$ NMQN$ EC@@% =9$ UMNN$
=##<$>43$0G##<P$;4F1$(*-1#<$
I'9K$
UDMQN$ 8MQN$ =9$ =9$
:3VF$W$'5R#F$I'9K$ @C@@% DMNN$ HC@@% =9$
X,Y*C$0,-."$634$)45J$I)*+#54J1K$ ICD@% HMNN$ /C@@% =9$
!"#$%&'($)*+,-./$0,.-*123#$04521,4-$
$ 6*.#$7$8$
!"#$%&'()*+%,-)./0%1)+1/-%2-)3/0%'*,%-/./*4/%
!"#$%&'#()*($+&,-)./$*0$12$3,4#%$#5,6-#%$."#4$.*$6#$%*-7$,.$8*5%)7#(,6-/$")3"#($
(#.,)-$'()8#%$.",5$."#)($92$8*&5.#(',(.%:$0*($#;,4'-#:$,''(*;)4,.#-/$<=>?@@$0*($
&5-)4).#7$&%#$A%?$<B?@@$0*($,$92$3,4#?$C5$,$4*5."-/$6,%)%:$12$3,4#%$,(#$
8&((#5.-/$'()8#7$,.$,''(*;)4,.#-/$<D?D@$A%?$<>?@@$0*($92?$E77).)*5,--/:$."#%#$12$
3,4#%$7*$5*.$(#+&)(#$")3"F#57$#;'#5%)A#$G)(#-#%%$",57%#.%$*($%4,(.$'"*5#%$.*$
'-,/?$H&((#5.-/:$4,%%$4,(I#.$G)(#-#%%$7#A)8#%$0(*4$*'#(,.*(%$-)I#$J#()K*5$
L)(#-#%%$,(#$%*-7$0*($,%$-)..-#$,%$<>M?MM$,57$%&''*(.$12$3,4#%?$E%$'()8#%$0*($
")3"F#57$",57%#.%$8*5.)5&#$.*$7#8-)5#:$.*7,/N%$")3"F#57$7#A)8#%$,(#$6#8*4)53$
.*4*((*GN%$4)5)4&4$6,%#-)5#?$!"#$OPB=@@$)--&%.(,.#%$.")%$7#8-)5)53$'()8#$
8&(A#?$E.$-,&58":$).$%*-7$0*($<=MM?MM?$!*7,/$).$%#--%$0*($<>M?MM?$E%$4*6)-#$7#A)8#$
8*%.%$7#8-)5#:$%&6%8()6#(%$,(#$%"*G)53$,$G)--)535#%%$.*$',/$")3"#($'()8#$'*)5.%$0*($
12$3,4#%:$,..#%.)53$.*$."#$A,-&#$."#/$'-,8#$*5$,$")3"#($+&,-)./$4*6)-#$3,4)53$
#;'#()#58#?$
$
%341"#39$:-$;3+9<$'*3-#=$,-$%544=$>?$@A$)*+#54B1$
51/%+6'78,-)./*%+'()*+%06749)6*%
Q5$A)#G$*0$).%$)44#5%#$'*'&-,()./:$)5"#(#5.$7()A#$.*$8*5.)5&*&%-/$'&%"$."#$
.#8"5*-*3/$#5A#-*'#:$,57$)58(#,%)53-/$G)7#%'(#,7$,7*'.)*5$,4*53$%#A#(,-$,3#$
3(*&'%:$3,4)53$,-%*$(#'(#%#5.%$."#$8*(5#(%.*5#$*5$G")8"$*."#($7,.,$%#(A)8#%$8,5$
6#$6&)-.?$!"#$4*5#.)K,.)*5$*0$3,4#%$#00#8.)A#-/$-,/%$,$0*&57,.)*5$0*($*."#($
4*5#.)K#7$*00#()53%:$%&8"$,%$-*8,.)*5F6,%#7$%#(A)8#%:$4&%)8:$,57$7)(#8.F.*F
8*5%&4#($%#(A)8#%?$
R(*4$7#%)35$.*$7#'-*/4#5.:$."#$STUL$P,4)53$V)35,.&(#$V*-&.)*5$",%$6##5$
."*&3".0&--/$7#A#-*'#7$.*$8(#,.#$,$%&'#()*($8*5%&4#($%#(A)8#$#;'#()#58#?$V)4)-,($
.*$."#$4,55#($)5$G")8"$V.,(6&8I%W$)%$,6-#$.*$'(*A)7#$,$8*4'-#.#$#;'#()#58#$0*($
A)%).*(%$.*$).%$'"/%)8,-$%.*(#$-*8,.)*5%$,57$8*44,57$'(#4)&4$'()8)53:$."#$STUL$
P,4)53$V)35,.&(#$V*-&.)*5$)%$7#%)35#7$.*$7*$."#$%,4#$0*($4*6)-#$3,4)53$6/$
'(*A)7)53$,$8,'.)A,.)53-/$)44#(%)A#$#;'#()#58#?$STUL$P,4)53$%##I%$.*$
)58(#,%#$8*5%&4#($-*/,-./$,57$."#$&%#$,57$'&(8",%#$*0$3,4#%$6/$#4'-*/)53$."(##$
&57#(-/)53$%.(,.#3)#%$.*$,8")#A#$.")%$3*,-?$
!$E&34#5.$7)%8*A#(/$*0$."#$8,.,-*3$."(*&3"$,$-**%#$8*58#'.$*0$*G5#(%")'$
%&((*&57)53$3,4#%$*G5#7$,57$5*.$*G5#7?$S/$7)%'-,/)53$3,4#%$.",.$."#$
%&6%8()6#($",%$,-(#,7/$6*&3".$,-*53$G)."$%)4)-,($3,4#%$.",.$(#4,)5$.*$6#$
'&(8",%#7:$."#$-)I#-)"**7$*0$."#$%&6%8()6#(N%$#;'-*(,.)*5$G).")5$."#$8,.,-*3$
)58(#,%#%?$
!"#$%&'#()*($+&,-)./$*0$12$
3,4#%$#5,6-#%$."#4$.*$6#$
%*-7$,.$8*5%)7#(,6-/$")3"#($
(#.,)-$'()8#%$.",5$."#)($92$
8*&5.#(
:$
;(*4$7#%)35$.*$7#'-*/4#5.<$."#$
=>?@$A,4)53$B)35,.&(#$
B*-&.)*5$",%$6##5$."*&3".0&--/$
7#C#-*'#7$.*$8(#,.#$,$%&'#()*($
8*5%&4#($%#(C)8#$#D'#()#58#:$
!Bibliothèques disponibles
"OpenGL ES
"Réseau (HTTP, TCP et UDP)
"Gestion de fichiers
"IHM (incluant un viewer HTML)
"Gestion de bases de données génériques ou spécifiques (au mobile)
"Gestion des sons
"Animation 2D (sprites)
"Cryptographie
"Données GPS
!Concept d’interface
"Tout fonctionne suivant ce concept : une structure stockant des pointeurs de
fonctions (permet la simulation de l’héritage)
!Application (Applet)
"Code exécutable
"Ressources
"MIF (fichier d’identification de l’application)
!Applet
"inclusion d’un fichier .bid qui stocke le ClassID (identificateur de l’appli)
"AEEClsCreateInstance : fonction obligatoire qui vérifie le ClassID et crée
une instance de structure qui représente l’applet grâce à la méthode
AEEApplet_New
"Exemple de structure :
typedef struct_myapp {
AEEApplet a; // obligatoire en 1er - représente l’héritage
// variables spécifiques ici
} myapp;
"Lors de l’appel à AEEApplet_New on spécifie la taille de la structure applet
et des pointeurs de fonctions pour traiter les événements et détruire l’applet.
"Exemple d’utilisation d’une interface :
IDISPLAY_Update (pMe->a.m_pIDisplay);
"pMe est le pointeur vers l’instance de la structure applet, m_pIDisplay est un
pointeur vers une interface IDisplay (fonctions d’affichage) et
IDISPLAY_Update est une macro qui invoque la fonction pointée par Update
de IDisplay ou d’une interface descendante.
!Exemple de code réseau avec ISockPort (compatible IPv4 et v6)
"Création de socket (pIsockPort - de type ISockPort*)
int result = ISHELL_CreateInstance( pMe->a.m_pIShell, AEECLSID_SOCKPORT,
(void **)&pMe->pISockPort );
"Précision de l’adresse et du port du serveur (sa de type AEESockAddrStorage)
pMe->sa.wFamily = AEE_AF_INET;
pMe->sa.inet.port = HTONS( 12345 );
INET_PTON( pMe->sa.wFamily, “10.0.1.127”, &pMe->sa.inet.addr);
"On peut choisir le réseau support (si plusieurs disponibles WLAN et UMTS par
exemple)
ISOCKPORT_SelectNetwork( pMe->pISockPort, AEE_NETWORK_WLAN );
"Ouverture du socket (on précise ici qu’on veut ouvrir une connexion TCP)
pMe->wSockType = AEE_SOCKPORT_STREAM;
ISOCKPORT_OpenEx( pMe->pISockPort, pMe->sa.wFamily, pMe->wSockType, 0 );
"Connexion du socket (éventuellement asynchrone : si le résultat est
AEEPORT_WAIT on re-demandera une connexion plus tard)
int result = ISOCKPORT_Connect( pMe->pISockPort, &pMe->sa );
"Ecriture (ici aussi c’est asynchrone donc on stocke les données et les indices - à
écrire et écrit - dans la structure de l’applet)
int result = ISOCKPORT_Write( pMe->pISockPort,
pMe->pBuffer + pMe->written,
pMe->toWrite - pMe->written );