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"); }
}
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);
}