Jni, use/unuse [prob ao invocar classe]

estou tentando pegar uma clsse escrita em java no codigo c para usar e implementar métodos, porém ocorre um erro qndo eu tento pegar uma instancia da classe que eu fiz:

codigo em c

[code]
instancia = use_Classe(env);
unuse_Classe(env);

mensagem de erro:
erro: ?use_Classe? was not declared in this scope
erro: ?unuse_Classe? was not declared in this scope[/code]
codigo em c++:

[code]
Classe::_use(env);
Classe::_unuse(env);

mensagem de erro:
erro: ?Classe? has not been declared
erro: ?_use? was not declared in this scope
erro: ?Classe? has not been declared
erro: ?_unuse? was not declared in this scope[/code]o codigo esta incluindo Classe.h e a variavel env esta sendo inicializada d maneira correta

meu codigo antigo q isto funciona gera um arquivo stubs com o javah, mas meu projeto novo nao possui esse stubs, sera q o problema esta ai? se esta, como faço pra ter essa instancia de minha classe usando o jni 5? e se o prob nao é a falta do stubs qual é entao?

O que estas funções/métodos fazem (poste o código)? Com o pouco de informação que você passou fica difícil ajudar.

Como eu já te disse em outra mensagem, o formato de chamada a código nativo mudou totalmente a partir da versão 1.2. Não tem jeito, você vai ter que re-escrever seu código.

Em que versão do Java você rodava antes?

cara, o codigo antigo nao foi eu qm escreveu, estou aprendendo a mexer com jni agora, eu disse ‘meu codigo’ como força de expressao, pq é oq eu tenho aqui como refencia da api para meu projeto

nao sei em qual versao a api antiga foi compilada, mas parece ser anterior à 1.2, ja q ela apresenta alguns recursos antigos como vc disse no outro topico

mas eu estou tendo varios outros problemas com essa api q estou trabalhando, acho q a maioria deles por inexperincia com jni, mas tive q fazer varias mudandcas nos codigos e só postei aqui problemas q nao consegui resolver

realmente faltou muita explicacao vou tentar explicar melhor oq o codigo faz:

a api q eu uso possui codigos em java e em c/c++, existe uma classe escrita em java que é a base da api, onde eu posso usala diretamente no codigo c/c++ ou herda-la pra q tenha outras funcionalidades e acrecentar alguns metodos nativos ou nao, e existem algumas funcoes em c q eu tenho q implementar, sao funcoes chamadas pela propia api em uso, qndo ocorre algum evento

mas o problema q eu apresentei foi d como ter uma instancia da classe feita em java no codigo c/c++, o exemplo q eu tenho faz uso dessas rotina use/unuse, q retorna um ponteiro para uma instancia da classe que se usa como prefixo © ou sulfixo (c++), sendo assim posso chamar os metodos dessa classe

uma coisa interessante é q o exemplo q eu tenho compila o codigo em c sem problemas, e no codigo q estou construindo q ocorre esse erro, nao existe nenhum parametro de compilacao diferente, pelo menos aparentemente né, pois concerteza algo esta faltando…

Como eu te disse, sem ver o código fica difícil ajudar. Boa sorte.

foi mal cara, nao postei o codigo pq nao tinha ele na mesma maquina q postei a ultima msg
esses sao os unicos trechos q usam jni, as partes comentadas sao as opcoes de codigo em c++, ambas nao funcionam
nao se preocupe com a funcao GetJavaEnv, ela funciona…

[code]
#include <jni.h>

//#define IMPLEMENT_ClasseJava
#include “ClasseJava.h”

JRIEnv* env;

jref GetJavaClass()
{
struct java_lang_Class *classeref;
//java_lang_Class *classeref;

env = GetJavaEnv();

if (env == NULL)
	return NULL;

classeref = use_ClasseJava(env);
//classeref = ClasseJava::_use(env);

if (myClass == NULL)
	env = NULL;

return (jref) classref;

}

void Exit(void)
{
if (env)
unuse_JPlugin(env);
//JPlugin::_unuse(env);
}[/code]

Esse ClasseJava.h é o header da implementação das funçoes que você está querendo usar, você tem o fonte da implementação ou o objeto compilado?
No seu compilador você configurou tudo certo, que compilador você usa?

Outra coisa, o seu código antigo também inclui o jni.h?

sim, eu tenho a classe compilada, neste codigo estou tentando acessar uma classe q eu mesmo fiz, todos os arquivos estao no mesmo diretorio (.java, .class e .h), no exmplo q eu tenho existe uma classe Simple.java com o codigo fonte, e todos os arquivos (.java, .class, .h e simple.c q esta o codigo nativo), inclusive os stubs q, como vc disse no outro topico, nao sao mais gerados pelo javah

versao dos compiladores:

[code]
$ java -version
java version “1.5.0_06”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot™ Client VM (build 1.5.0_06-b05, mixed mode, sharing)

$ g++ --version
g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
Copyright © 2006 Free Software Foundation, Inc.[/code]
nao entendi oq vc disse sobre ‘configurar o compilador’

o codigo antigo nao inclui a jni.h, eu tinha colocado ela pra fazer um outro teste e esqeci d tirar, com ou sem ela o erro permanece

Você teria que analisar esse código e confirmar que mecanismo de chamada a código nativo ele usa (antigamente cada VM tinha o seu). Se for feita para a JVM da Microsoft, por exemplo, não vai rodar em Linux. O código já existente você consegue rodar no Ubuntu?

Você tem que passar ao seu compilador (o GCC) onde encontrar as bibliotecas (.a e .so), os fontes (.c ou .cpp) e os headers (.h) que você está usando, mais algumas configurações que dependem do seu projeto.

Se puder, poste o código dessa função “use_Classe(env)”.

o codigo antigo roda no linux sim

enquanto ao compilador, estou sim informando onde estao as biliotecas, mas uma de minhas desconfiancas é q falta alguma delas, a outra é q pode ter mudado a forma de se obter o objeto

ou ta faltando informaçao ou eu nao estou conseguindo entender como as coisas funcionam (a segunda opcao é mais provavel)…
eu procurei neste guia da sun sobre meu problema mas nao achei nada

posso sim mostrar o codigo da minha classe java, mas nao ha nada d+ nela, ainda é apenas um teste

[code]
public class ClasseJava
{
public ClasseJava() {}

public String mensagem()
{
	return "deu certo";
}

}[/code]

[quote=quikkoo]
posso sim mostrar o codigo da minha classe java, mas nao ha nada d+ nela, ainda é apenas um teste

[code]
public class ClasseJava
{
public ClasseJava() {}

public String mensagem()
{
	return "deu certo";
}

}[/code][/quote]
Eu me referi ao código dessa função: “use_Classe(env),” como é o código dessa função? Note que ela está em português, deve ter alguma implementação particular ali.

Coloque também as mensagens completas de erro que o GCC te deu.

ah, foi mal, mas eu pensei q ja tivesse esplicado isso, a sintaxe é a seguinte:

(un)use_<nome da classe>(env);esse codigo é gerado pelo javah… nao sei em arquivo esta, pq eu só tenho os .h q ele gera
mas eu to achando q ele era gerado, e nao é mais, isso porque nao exitem mais os stubs e tal, e pelo q eu estive lendo aqui parece q sao neles q essa funcao é definida

bom, d qlqr forma eu já agradeço sua boa vontade em me ajudar, vou continuar tentando aqui… flw , t+