delphi调用java类(通过jni.pas)

delphi调用java类(通过jni.pas)

  (2010-03-20 23:41:09)
标签: 

杂谈

分类: java

unit test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,jni;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  jvm: Jni.PJavaVM;
    tenv: Jni.TJNIEnv;

    cid: Jni.JClass;
    mid: Jni.JMethodID;
    tmp: Jni.JString;
    sj:Jni.JString;
    vm_args: Jni.JavaVMInitArgs;                       //建立 JVM 的參數
    options: array[0..2] of Jni.JavaVMOption;
    env: Jni.PJNIEnv;
    rec: Integer;
    jclsIns:JObject;
    ret:String;
const
  str='傳給java的參數是--' +'你好,java jni,我要战胜你!';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   excep:Jni.JThrowable;
   pjval:jni.PJValue;
begin
   options[0].optionString := '-Djava.compiler=NONE';
    options[1].optionString := '-Djava.class.path=D:\\insure_XT\\insurext\\build\\classes';   // Java 工程路徑, '.' 表示黨前路徑
    options[2].optionString := '-verbose:jni';

    JNI_GetDefaultJavaVMInitArgs(@vm_args);
    vm_args.version := Jni.JNI_VERSION_1_6;
    vm_args.options := @options;
    vm_args.nOptions := 3;
    vm_args.ignoreUnrecognized := Jni.JNI_TRUE;

    rec := Jni.JNI_CreateJavaVM(@jvm, @env, @vm_args);   //建立JVM
    if (rec = JNI_ERR ) then begin
        edit1.Text:='建立java虚拟机jvm出错(Jni.JNI_CreateJavaVM)';
        exit;
    end;
   
    tenv := TJNIEnv.Create(env);
    if tenv=nil then Begin
        edit1.Text:='获取java环境出错';
        Exit;
    End;


   
    //取得 DelphiCallJava 的類ID, 如果有'包',也指定, <package>.<class>
    cid := tenv.FindClass('insure/Test');
    if (tenv.ExceptionCheck()) then begin
        edit1.Text:='找不到类insure.Test';
        excep:=tenv.ExceptionOccurred;

      
        tenv.ExceptionClear;
        freeAndNil(tenv);
        jvm^.DestroyJavaVM(jvm);
        Exit;
    end
    else
    begin
       edit1.Text:='找到类insure/Test';
    end;

    //初始化类的新实例
    mid:=tenv.GetMethodID(cid,'<init>','()V');
    if(mid=nil) then begin
        edit1.Text:='获取Test类的构造函数出错';
        freeAndNil(tenv);
        jvm^.DestroyJavaVM(jvm);
        Exit;
    end;

    jclsIns:=tenv.NewObjectV(cid,mid,nil);
    if(jclsIns=nil) then begin
        edit1.Text:='初始化类出错';
        freeAndNil(tenv);
        jvm^.DestroyJavaVM(jvm);
        Exit;
    end;

 

 

     //取得方法ID

    mid := tenv.GetMethodID(cid, 'jniTest', '(Ljava/lang/String;)Ljava/lang/String;');  //(Ljava/lang/String;)I
    if (mid = nil) then begin
        edit1.Text:='找不到方法jniTest';
        freeAndNil(tenv);
        jvm^.DestroyJavaVM(jvm);
        Exit;
    end
    else
      edit1.Text:='找到jniTest方法';

 


    //將 string 轉換成 java string
    tmp := tenv.StringToJString(PChar(UTF8Encode(str)));
    //用類ID和方法ID調用 JAVA 方法
    //pjval:=tenv.ArgsToJValues([tmp]);

    sj:=tenv.CallObjectMethod(jclsIns, mid,[tmp]);
    //sj:=env^.CallIntMethodV(env,cid,mid,nil);
    //ret:=tenv.JStringToString(sj);
    ret:=tenv.UnicodeJStringToString(sj);

    self.Canvas.TextOut(40,40, str);
    self.canvas.textout(60,60,'返回值为--' + ret);
    edit1.Text:='从java类获取的方法结果为';

    if tenv<>nil then begin
        freeAndNil(tenv);
        jvm^.DestroyJavaVM(jvm); //釋放JVM資源
    End;


end;

 

end.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值