LuaJava
Ferramenta de scripts para Java

LuaJava foi testado nas plataformas Windows e Linux usando o Java JDK 1.4. LuaJava é compatível com o JDK 1.4 ou posterior.

Compilação

A distribuição do código fonte de LuaJava inclui um nmakefile do Windows e um makefile do Linux. Edite o arquivo config para que aponte para o JDK, os diretórios Lua, bem como as bibliotecas e os compiladores de C.

Windows

LuaJava pode ser compilado para Windows usando nmake em MSVC++. Para fazer isso, execute o comando VCVARS32.BAT antes de executar nmake:

c:\luajava-1.1>"drive:\complete_path_to\VCVARS32.bat"
c:\luajava-1.1>nmake -f nmakefile

Linux

Para compilar LuaJava para Linux e OSX, execute este procedimento:

make

Instalação

A compilação do LuaJava gera dois arquivos: luajava-1.1.jar e luajava-1.1.dll (ou libluajava-1.1.so no Unix, ou libluajava-1.1.jnilib no MacOSX).

luajava-1.1.jar
Este arquivo deve ser copiado em um caminho no CLASSPATH da aplicação java.
luajava-1.1.dll (ou libluajava-1.1.so ou libluajava-1.1.jnilib)
Este arquivo deve ser copiado em um diretório de sistema, o que depende do sistema operacional. Os usuários de Windows podem usá-lo no diretório bin da JRE ou na pasta do sistema Windows. Os usuários Unix podem colocá-lo no diretório bin da JRE ou em um diretório apontado pela variável de ambiente LD_LIBRARY_PATH.

Execução do Console LuaJava

O LuaJava é distribuído com um console simples. Para executá-lo, digite:

c:\luajava-1.1>java -cp "luajava-1.1.jar"
       org.keplerproject.luajava.Console

Referência de Lua

Um dos objetivos do LuaJava é permitir que o programador manipule objetos Java da mesma maneira em que os objetos nativos de Lua são manipulados. Lua, como a maioria das linguagens interpretadas, tem tipos dinâmicos. As variáveis não têm tipos, cada valor carrega em si seu próprio tipo. Lua não tem declarações, mas as variáveis podem conter qualquer valor da linguagem. LuaJava cria uma biblioteca em Lua chamada luajava. Essa biblioteca oferece cinco funções:

newInstance(className, ...)

Esta função cria um novo objeto Java e retorna um objeto Lua que é uma referência ao objeto Java. Você pode acessar esse objeto com a sintaxe normal usada para acessar métodos em objetos Lua.

O primeiro parâmetro é o nome da classe a ser instanciada. Os outros parâmetros são passados para o construtor da classe Java.

Exemplo:

obj = luajava.newInstance("java.lang.Object")
-- obj passa a ser uma referência ao novo objeto
-- criado e qualquer um de seus métodos pode ser acessado.

-- cria um gerador de token de string para a string "a,b,c,d"
-- usando "," como o separador de token.
strTk = luajava.newInstance("java.util.StringTokenizer", 
    "a,b,c,d", ",")
while strTk:hasMoreTokens() do
    print(strTk:nextToken())
end

O código anterior deve imprimir o seguinte na tela:

a
b
c
d
bindClass(className)

Esta função recupera uma classe Java que corresponde a className. O objeto retornado pode ser usado para acessar campos estáticos e métodos da classe correspondente.

Exemplo:

sys = luajava.bindClass("java.lang.System")
print ( sys:currentTimeMillis() )

-- imprime a hora retornada pela função.
new(javaClass)

Esta função recebe uma java.lang.Class e retorna uma nova instância dessa classe.

new funciona da mesma maneira que newInstance, mas o primeiro argumento é uma instância da classe.

Exemplo:

str = luajava.bindClass("java.lang.String")
strInstance = luajava.new(str)
createProxy(interfaceNames, luaObject)

Em vez de criar um objeto Java para ser manipulado por Lua, também é possível criar um objeto Lua para ser manipulado por Java. Podemos fazer isso em LuaJava criando um proxy para esse objeto. Isso é realizado pela função createProxy.

A função createProxy retorna uma referência a um objeto Java que pode ser usada como uma implementação da interface dada.

createProxy recebe uma string que contém os nomes das interfaces a serem implementadas, separadas por uma vírgula (,) e um objeto Lua que é a implementação da interface.

Exemplo:

button = luajava.newInstance("java.awt.Button", "execute")
button_cb = {}
function button_cb.actionPerformed(ev)
 . . .
end

buttonProxy = luajava.createProxy("java.awt.ActionListener", 
    button_cb)

button:addActionListener(buttonProxy)

Podemos usar scripts Lua somente para escrever implementações de interfaces Java. Não é possível extender classes.

loadLib(className, methodName)

loadLib é uma função cujo uso é semelhante ao da função loadlib de Lua. O objetivo dessa função é permitir que os usuários escrevam bibliotecas em Java e, depois, as carreguem em Lua.

O que loadLib faz é chamar uma função estática em uma dada classe e executar um determinado método, que deve receber LuaState como parâmetro. Se essa função retornar um número inteiro, LuaJava considera esse valor como o número de parâmetros retornados pela função; caso contrário, nada será retornado.

O exemplo em Lua a seguir pode acessar a global eg criada pela classe Java test.LoadLibExample:

luajava.loadLib("test.LoadLibExample", "open")
eg.example(3)

E este exemplo de Java implementa o método example:

public static int open(LuaState L) throws LuaException
{
  L.newTable();
  L.pushValue(-1);
  L.setGlobal("eg");

  L.pushString("example");

  L.pushJavaFunction(new JavaFunction(L) {
    /**
     * Exemplo para loadLib.
     * Imprime a hora e o primeiro parâmetro, se houver.
     */
    public int execute() throws LuaException
    {
      System.out.println(new Date().toString());
    
      if (L.getTop() > 1)
      {
        System.out.println(getParam(2));
      }

      return 0;
    }
  });

  L.setTable(-3);

  return 1;
}

Referência Java

O Manual de referência Java do LuaJava é gerado por JavaDoc para facilitar a navegação.

Valid XHTML 1.0!

$Id: manual.html,v 1.6 2007/01/23 22:37:28 thiago Exp $