Ir para o conteúdo

 Voltar a Ginga-NCL: I...
Tela cheia

Registrando funções em C++ no lua_State do LuaPlayer

17 de Março de 2010, 19:44 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 61 vezes

Olá a todos,

 Estou alterando o módulo LuaPlayer para que ele reconheça algumas funções em C++, fazendo com que uma aplicação NCL/Lua possa realizar chamadas para estas funções.
 Consigo até registrar as funções em C++ no LuaState utilizando o comando "lua_register(lua_state, nome_simbolo, funcao_em_c++)", no entanto, quando o Lua em nível de aplicação (apresentação NCL) tenta invocar a minha função, o Lua retorna um erro indicando que a função não existe no lua state (nil value):

 PANIC: unprotected error in call to Lua API (/home/tiago/Desktop/exemplos/exemplo_01/teste.lua:2: attempt to call global 'lua_teste' (a nil value))

 Minha função em C++ é bem simples e foi declarada da seguinte maneira dentro da classe do LuaPlayer:

LUALIB_API int lua_teste(lua_State* L)
{

     cout << "verificando integração Lua/C++" << endl;
     return 1;
}

Já procurei em vários lugares e até agora não consegui encontrar uma maneira correta de registrar minhas funções no lua_State. Alguém já teve algum problema parecido?  

Autor: Tiago Pomponet


33 comentários

  • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
    17 de Março de 2010, 20:46

     

    Oi Tiago,

    vc tem que atribuir a sua funcao a um nome no lua.  Da uma olhada no LuaPlayer::load(), ele atribui a tabela do canvas variavel global `canvas' usando lua_setglobal(). 

    • 4438b5c2095f773e2e1c33587d7ede6f?only path=false&size=50&d=404Tiago Pomponet(usuário não autenticado)
      18 de Março de 2010, 13:29

       

      Olá Guilherme,Tentei utilizar a função lua_setglobal() como você indicou, mas mesmo assim não obtive solução para o problema anterior. Quanto à função LuaPlayer::load() é ela mesma que estou alterando, isto é, é nesta função que estou tentando alterar o lua_State registrando alguma outra função, no caso: lua_teste(). O método load do LuaPlayer está assim:void LuaPlayer::load (){     if (this->loaded) return;     this->loaded = true;     // disponibiliza a superficie do NCLua atraves do modulo canvas     ISurface* s = this->getSurface();     if (s) {          lua_createcanvas(this->L, s, 0);              // [ canvas ]          lua_setglobal(this->L, "canvas");             // [ ]     }     // carrega o NCLua e checa se houve erros     if( luaL_loadfile(this->L, this->mrl.c_str()) ) { // [ func ]          this->notifyListeners(PL_NOTIFY_ABORT, "");          lua_error(this->L);          return;     }     // registra a função teste no lua_state     lua_register(this->L, "lua_teste", lua_teste);     lua_setglobal(this->L, "lua_teste");     lua_call(this->L, 0, 0);                          // [ ]} Mesmo inserindo a linha lua_setglobal(this->L, "lua_teste") o erro abaixo continua: Running Lua 5.1PANIC: unprotected error in call to Lua API (/home/tiago/Desktop/exemplos/exemplo_01/teste.lua:2: attempt to call global 'lua_teste' (a nil value)) O arquivo teste.lua é bem simples, só escreve na tela a versão do lua e em seguida deveria invocar a função lua_teste():io.write("Running ", _VERSION, "\n")a = lua_teste() Grato, Tiago Pomponet 

      • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
        18 de Março de 2010, 14:09

         

        Tiago,

        acho q o problema eh q vc esta registrando a funcao apos a chamada luaL_loadfile().  Tente colocar o lua_register antes.  Outra coisa, ao inves de modificar o LuaPlayer nao seria melhor vc fazer uma biblioteca externa e usar `require' para carega-la?

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo