<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GWT Brasil &#187; native</title>
	<atom:link href="http://www.gwt.com.br/tag/native/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gwt.com.br</link>
	<description>Grupo de usuários do GWT no Brasil</description>
	<lastBuildDate>Sat, 10 Oct 2009 03:37:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JSNI &#8211; Java Script Native Interface</title>
		<link>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</link>
		<comments>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:09:42 +0000</pubDate>
		<dc:creator>bruno.catao</dc:creator>
				<category><![CDATA[Avançado]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jni]]></category>
		<category><![CDATA[jnsi]]></category>
		<category><![CDATA[native]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</guid>
		<description><![CDATA[Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.
PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma [...]]]></description>
			<content:encoded><![CDATA[<p>Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.</p>
<p>PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma aplicaÃ§Ã£o mais robusta do que um Hello World nos deparamos com alguns problemas um pouco mais complicados.</p>
<p>Vou tentar escrever alguns posts falando de algumas experiÃªncias que eu tive com GWT, os problemas que surgiram e como eu resolvi estes problemas.</p>
<p>O primeiro problema que eu tive foi quando tentei utilizar uma biblioteca javascript prÃ©-existente, ou quando eu tentei utilizar alguma funcionalidade que hÃ¡ nos objetos providos pelos browser via javascript (window, document, etc) mas estÃ¡ implementada nos mesmos objetos no nÃ­vel GWT.</p>
<p>A forma que encontrei para resolver este (e mais um monte de problemas) foi utilizar JSNI &#8211; Java Script Native Interface. JSNI estÃ¡ para GWT assim como JNI (Java Native Interface) estÃ¡ para Java. Com JSNI Ã© possÃ­vel implementar o corpo de mÃ©todos GWT utilizando Java Script.</p>
<p>Vejamos um exemplo. Vamos supor que, por alguma razÃ£o esquisita, eu queira escrever um mÃ©todo que faÃ§a o mesmo que o <strong>Window.alert</strong>. Vamos chamar este mÃ©todo de meuAlert:</p>
<p>[java]<br />
public native void meuAlert(String mensagem) /*-{<br />
alert(mensagem);<br />
}-*/;<br />
[/java]<br />
<span id="more-43"></span><br />
Apesar de este nÃ£o ser um exemplo muito funcional (na realidade ele nÃ£o Ã© funcional de jeito nenhum) dÃ¡ pra entender a &#8220;mecÃ¢nica da coisa&#8221;. Todo mÃ©todo JSNI deve ser declarado como native (assim como mÃ©todos cuja implementaÃ§Ã£o serÃ¡ feita em JNI, utilizando Java convencional). A implementaÃ§Ã£o do mÃ©todo deve vir em um bloco comentado localizado entre o fim da lista de parÃ¢metros do mÃ©todo e o seu ponto-e-vÃ­rgula. O bloco de cÃ³digo JSNI Ã© delimitado por &#8220;-{&#8221; e &#8220;}-&#8221;, desta forma o tradutor Java/Java Script do GWT irÃ¡ saber que este bloco de comentÃ¡rios trata-se na realidade de instruÃ§Ãµes Java Script.</p>
<p>Vimos como fazer chamadas do lado Java para Java Script, vamos ver agora como fazer o caminho contrÃ¡rio, chamar mÃ©todos Java de dentro de cÃ³digo JSNI.</p>
<p>Para isto, basta chamar o mÃ©todo de qualquer classe seguindo a convenÃ§Ã£o:</p>
<p><code>[instÃ¢ncia.]@nomeDaClasseCompleto::nomeDoMetodo(assinaturaDosParametros)(argumentos)</code></p>
<p>Onde:</p>
<ul>
<li>instÃ¢ncia (atributo opcional) &#8211; Referente a instÃ¢ncia da qual o mÃ©todo serÃ¡ chamado, caso nÃ£o seja informada uma instÃ¢ncia, serÃ¡ assumido que a chamada serÃ¡ feita de forma estÃ¡tica;</li>
<li>nomeDaClasseCompleto &#8211; &#8220;full qualified class name&#8221;, ou seja, o nome da classe completo (toda a Ã¡rvore de pacotes seguido do nome da classe);</li>
<li>nomeDoMetodo &#8211; Nome do mÃ©todo que serÃ¡ chamado;</li>
<li>assinaturaDosParametros &#8211; Assinatura dos parÃ¢metros no formato <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html#wp16432" target="_blank" title="Assinatura dos ParÃ¢metros JNI">JNI</a>;</li>
<li>argumentos &#8211; Lista de valores passados como parÃ¢metros para o mÃ©todo.</li>
</ul>
<p>Vamos fazer outro exemplo simples:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>public class TesteJSNI  {<br />
public void exibeMensagem(String nome, int idade)  {<br />
Window.alert(&#8221;nome: &#8221; + nome + &#8221; &#8211; idade: &#8221; + idade);<br />
}</p>
<p>public native void callJavaMethod(TesteJSNI teste, String nome, int idade) /*- {<br />
teste@br.com.gwt.client.TesteJSNI::exibeMensagem(Ljava/lang/String;I)(nome, idade);<br />
}-*/;<br />
}<br />
[/java]</p>
<p>Por fim, JSNI define dois objetos implÃ­citos $wnd e $doc, que nos permitem, respectivamente acessar os contextos da janela e do documento principais. Estes objetos sÃ£o importantes pois, como o cÃ³digo GWT Ã© executado em um iframe oculto, se vocÃª tentar utilizar window e document diretamente, vocÃª nÃ£o irÃ¡ acessar a janela e o documento principais, mas sim do iframe oculto do GWT. Outro motivo, Ã© que estes objetos devem ser utilizados quando se quiser criar funÃ§Ãµes nomeadas que o programador queira chamar posteriormente em um outro ponto do cÃ³digo. A razÃ£o para isto Ã© que o cÃ³digo gerado pelo GWT Ã© ofuscado, entÃ£o, qualquer nome de funÃ§Ã£o atribuÃ­do diretamente via JSNI serÃ¡ ofuscado, tornando impossÃ­vel de &#8220;adivinhar&#8221; qual serÃ¡ esse nome em tempo de compilaÃ§Ã£o.</p>
<p>Vamos a alguns exemplos:</p>
<p><strong>DefiniÃ§Ã£o de uma funÃ§Ã£o:</strong></p>
<p>[java]<br />
public native void criaFuncao() /*{-<br />
$wnd[meuAlert] = function() {<br />
$wnd.alert(&#8217;Teste&#8217;);<br />
}-}*/;</p>
<p>public native void chamaFuncao() /*-{<br />
$wnd[meuAlert]();<br />
}-*/;<br />
[/java]</p>
<p><strong>Adicionando um listener ao documento:</strong></p>
<p>[java]<br />
public void trackMousePosition() /*-{<br />
$doc.addMouseMoveListener(function(evt) {<br />
$wnd.title = &#8216;x: &#8216; + evt.x + &#8216; &#8211; y: &#8216; + evt.y;<br />
});<br />
}-*/;<br />
[/java]</p>
<p>Por enquanto Ã© sÃ³. No prÃ³ximo post eu vou mostrar como se faz uma invocaÃ§Ã£o JSONP utilizando os conceitos mostrados aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
