Duvida java native interface

Olá pessoal,

estou com um problema na utilização de JNI. Eu criei uma classe para acessar o banco Sql Server há algum tempo atrás utilizando JDBC, faço um select na base´, ela me retorna 13.000 registros e consigo percorrer todos em pouco mais de 3 segundos. Porem tive a necessidade de utilizar esta classe java em um código C++ que estou desenvolvendo. Como tenho interesse em rodar esse código C++ em ambiente Linux e acessar outros bancos como postgree e mysql resolvi não implementar em C++ o acesso ao banco, mas sim utilizar a classe java. Então resolvi fazer um teste, carrego a máquina virtual no meu código C++ e faço select e percorro todos os 13.000 registros, porem num tempo completamente absurdo. Enquanto no java puro obtive um pouco mais de 3 segundos no C++ acessando a classe java utilizando JNI o tempo subiu para quase 1 minuto para percorrer os 13.000 registros. Minha curiosidade era saber onde estava o gargalo e descobri que nas chamadas abaixo: GetMethodID e CallObjectMethod após algumas iterações elas demoravam ate 3 segundos para retornar. Abaixo eu coloquei a chamada fprintf para logar os tempos no arquivo. Minha pergunta é: Como poderia melhorar este tempo para algo proximo dos 3 segundos? por que CallObjectMethod e GetMethodID às vezes demora até 3 segundos para retornar? Lembrando que o codigo java é o mesmo, eu apenas utilizo estes métodos para executar métodos java.

Meu e-mail é flaviotiba@gmail.com, se alguem souber a resposta por favor entre em contato comigo.

string BancoDados::obtemRegistroString(string nomeColuna)
{
jmethodID idMetodo = NULL;
jboolean copia = true;
jstring valorRetorno = NULL;
string registro;
long horaInicial,horaFinal;
double tempo = 0.0;

time(&horaInicial);
idMetodo = ambiente->GetMethodID(classe,"obtemRegistroString","(Ljava/lang/String;)Ljava/lang/String;");
time(&horaFinal);
tempo = (double)(horaFinal - horaInicial);
fprintf(arquivoID,"\nTempo: %.10f",tempo);

if(ambiente->ExceptionCheck())
{
	if(this->ativarMensagensErro)
	{
		ambiente->ExceptionDescribe();
	}
	ambiente->ExceptionClear();
	return registro;
}
else
{
	jstring parametro1 = ambiente->NewStringUTF (nomeColuna.c_str());

	time(&horaInicial);
	valorRetorno = (jstring)ambiente->CallObjectMethod(instanciaClasse,idMetodo,parametro1);
	time(&horaFinal);
	tempo = (double)(horaFinal - horaInicial);
	fprintf(arquivoCall,"\nTempo: %.10f",tempo);
	if(ambiente->ExceptionCheck())
	{
		if(this->ativarMensagensErro)
		{
			ambiente->ExceptionDescribe();
		}
		ambiente->ExceptionClear();
		return registro;
	}
	else
	{
		const char* dados = ambiente->GetStringUTFChars(valorRetorno,&copia);

		registro = dados;
		
		ambiente->ReleaseStringUTFChars(valorRetorno,dados);
	}
}

return registro;

}

Faça cache da chamada GetMethodId, ela é lenta mesmo. E arrume teu código para não ter leak objetos como tem hoje.