JNI - Liberação de instância

2 respostas
L

Olá pessoal.

Indo direto ao assunto: sempre que retorno um JString, não há liberação do aplicativo, parece que fica "travado" esperando retornar ao prompt. Realizei alguns testes usando o Delphi (7) . Preciso usar um CRTL+C para terminar a aplicação.

Para o Delphi 7, usei o material do Matthew Mead, enquanto para DevC usei o material da propria sun (javah e headers). Estou usando a jvm 1.4.1 (restrição do projeto).

o código que criei: Java:
package testes;

import javax.swing.JOptionPane;

public class DelphiJNI {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DelphiJNI delphiJNI = new DelphiJNI();
		String msg;
		delphiJNI.apenasRecebeDados("Não sabe o que faz... :p");
		delphiJNI.fazNada();
		msg = delphiJNI.retornaNome();
		JOptionPane.showMessageDialog(null, msg);
		delphiJNI = null;
	}
	
	public native String retornaNome();
	
	public native void fazNada();
	
	public native void apenasRecebeDados( String teste );
	
	static { System.loadLibrary("Testao"); }

}
Delphi:
library testes_DelphiJNI;

uses JNI, dialogs;

(*
 * Class:      testes_DelphiJNI
 * Method:     retornaNome
 * Signature:  ()Ljava/lang/String;
*)
function Java_testes_DelphiJNI_retornaNome
  (PEnv: PJNIEnv; Obj: JObject): JString; {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
  env: TJNIEnv;
begin
  env:= TJNIEnv.Create(PEnv);
  result := env.NewStringUTF('Teste de retorno de dados');
  env.free;                  
end;

(*
 * Class:      testes_DelphiJNI
 * Method:     fazNada
 * Signature:  ()V
*)
procedure Java_testes_DelphiJNI_fazNada
  (PEnv: PJNIEnv; Obj: JObject); {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
begin
end;

(*
 * Class:      testes_DelphiJNI
 * Method:     apenasRecebeDados
 * Signature:  (Ljava/lang/String;)V
*)
procedure Java_testes_DelphiJNI_apenasRecebeDados
  (PEnv: PJNIEnv; Obj: JObject; Arg1: JString); {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
var
  env: TJNIEnv;
begin
  env := TJNIEnv.Create(PEnv);
  ShowMessage(env.JStringToString(arg1));
  env.free;
end;

exports
  Java_testes_DelphiJNI_retornaNome,
  Java_testes_DelphiJNI_fazNada,
  Java_testes_DelphiJNI_apenasRecebeDados;

end.

Posteriormente fiz um teste com um código equivalente em C++, mas a mesma coisa aconteceu. Uma outra coisa interessante: quando chamo apenas métodos que não retornam valores, com o "faznada" ou o "apenasRecebeDados", o programa consegue terminar normalmente.
O que estou fazendo de errado? Grato !

Ah, código equivalente ao acima em C.. que aconteceu a msm coisa :(

#include "testes_DelphiJNI.h"
#include <iostream>

using namespace std;
/*
 * Class:     testes_DelphiJNI
 * Method:    retornaNome
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_testes_DelphiJNI_retornaNome
  (JNIEnv *env, jobject obj)
{
          return env->NewStringUTF("String sendo retornada...");
}


/*
 * Class:     testes_DelphiJNI
 * Method:    fazNada
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_testes_DelphiJNI_fazNada
  (JNIEnv *env, jobject obj)
{
}

/*
 * Class:     testes_DelphiJNI
 * Method:    apenasRecebeDados
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_testes_DelphiJNI_apenasRecebeDados
  (JNIEnv *env, jobject obj, jstring val)
{
  const char *str = env->GetStringUTFChars(val, NULL);
  cout << str << endl;
  env->ReleaseStringUTFChars(val, str);
}

2 Respostas

V

Amigo, já tambem tive algums problemas com o uso de JNI(JAVA+ DELPHI), principalmente problemas no Delphi devido a Acesso Violento na memória. No meu caso acabei por migrar de JNI para uso de ActiveX e utilizei o Jacob. Existe esta possibilidade de migrar para ActiveX? Mas este caso teria a restrição de funcionar somente em servidores Linux, tem algum problema nisso?

L

Valeu pelo toque, mas agora o desenvolvimento do programa está num nível mais avançado :(. O problema de sempre: tudo pra ontem. Mas sem problemas, já consegui contornar o akele probleminha, e estou finalizando o programa.

Vou procurar algo sobre esse JACOB, pode ser que ainda precise dele.

Novamente, agradecido.

Criado 20 de fevereiro de 2009
Ultima resposta 6 de mar. de 2009
Respostas 2
Participantes 2