首页 > 代码库 > 世界上最恶心的调用方法:Delphi调用Java的class方法法

世界上最恶心的调用方法:Delphi调用Java的class方法法

世界上最恶心的调用方法是,:用Delphi调用Java的class方法:

如果写了一个java方法:

package com.api;
public class DelphiCallJava {

    public static String dTest(String args,int args2,String args3){
        if(args==null){
            return "您沒有輸入參數.";
        }else {
            return "您輸入的參數是:"+args;
        }
    }

}


用delphi调用:

procedure TForm1.Button2Click(Sender: TObject);
var
  terminal_no,address:string;
  afn,fn,protocol:integer;
  cs_jsonString:string;
  jstr:jni.JString;
  jint:jni.JInt;
  jarray:jni.JArray;
begin
  //cid:=tenv.FindClass(‘com/api/DelphiCallJava‘);
  cid:=tenv.FindClass(‘dataframe/api/implement/BuildBw‘);//包名用/分隔

   if (cid = nil) then begin
        Windows.MessageBox(Handle, ‘找不到類:DelphiCallJava‘, ‘DelphiCallJava‘, Windows.MB_OK);
        exit;
   end;

   //mid:=tenv.GetMethodID(cid,‘<dTest>‘,‘()Ljava/lang/String‘);
   //if(mid=nil)then
   //begin
   //     ShowMessage(‘获取dTest构造函数出错‘);
   //     exit;
   //end;

   //取得方法ID
   //mid := tenv.GetStaticMethodID(cid, ‘dTest‘, ‘(Ljava/lang/String;)Ljava/lang/String;‘);
   //mid := tenv.GetStaticMethodID(cid, ‘dTest‘, ‘(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;‘);
   //mid := tenv.GetStaticMethodID(cid, ‘dTest‘, ‘(Ljava/lang/String;I)Ljava/lang/String;‘);//int参数用I,恶心吧^_^,string用;结束,integer不能有;,而且有多个integer参数时用多个IIII就行了,浪费了我多少时间找这个规则,可以说什么鸟规则~~
   //mid := tenv.GetStaticMethodID(cid, ‘dTest‘, ‘(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String;‘);//OK
   //mid := tenv.GetStaticMethodID(cid, ‘dTest3‘, ‘(II)Ljava/lang/String;‘);


   //mid := tenv.GetStaticMethodID(cid, ‘dTest2‘,‘(Ljava/lang/String;Ljava/lang/String;/Ljava/lang/int;/Ljava/lang/int;/Ljava/lang/int;/Ljava/lang/String;)Ljava/lang/String;‘);//错误
    //mid := tenv.GetStaticMethodID(cid, ‘dTest2‘,‘(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)Ljava/lang/String;‘);//OK
    mid := tenv.GetStaticMethodID(cid, ‘buildBw_zc‘,‘(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)Ljava/lang/String;‘);//为什么错误,因为BuildBw_zc不是static方法,要把static去掉
    if (tenv.ExceptionOccurred()<>nil) then begin
        Windows.MessageBox(Handle, ‘找不到方法(dTest2)‘, ‘DelphiCallJava‘, Windows.MB_OK);
        exit;
    end;

    //將 string 轉換成 java string
    strParam:=‘傳給java的參數‘;
    //tmp := tenv.StringToJString(PChar(UTF8Encode(strParam)));
    tmp := tenv.StringToJString(PChar(SysToUTF8(strParam)));
    //tmp := tenv.StringToJString(PChar(UTF8ToSys(strParam)));
    //用類ID和方法ID調用 JAVA 方法
    tmp := tenv.CallStaticObjectMethod(cid, mid, [tmp]);
    if (tenv.ExceptionOccurred()<>nil) then begin
        Windows.MessageBox(Handle, ‘調用方法(dTest)失敗!‘, ‘DelphiCallJava‘, Windows.MB_OK);
        //goto lexit;
    end;

    //顯示結果
    ShowMessage( ‘‘  );
    ShowMessage( ‘傳給java的參數是:‘ +strParam );
    //ShowMessage( ‘java返回:‘+UTF8Decode(tenv.JStringToString(tmp))  );
    ShowMessage( ‘java返回:‘+SysToUTF8(tenv.JStringToString(tmp))  );
    ShowMessage( ‘java返回:‘+UTF8ToSys(tenv.JStringToString(tmp))  );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  options[0].optionString:=‘-Djava.compiler=NONE‘;
  //options[1].optionString:=‘-Djava.class.path=.;D:\jdk1.6.0_24\jre\bin\client;‘;// Java 工程路徑, ‘.‘ 表示黨前路徑
  options[1].optionString:=‘-Djava.class.path=.;D:\jdk1.6.0_24\lib;‘;
  options[2].optionString:=‘-verbose:jni‘;

  JNI_GetDefaultJavaVMinitArgs(@vm_args);
  vm_args.version:=jni.JNI_VERSION_1_4;
  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
    windows.MessageBox(handle,‘create JVM exception.‘,‘error‘,MB_OK);
  end;

  tenv:=TJNIEnv.Create(env);
  if tenv=nil then
  begin
    MessageBox(handle,‘please load jvm first.‘,‘error‘,MB_OK);
    exit;
  end;
end;

世界上最恶心的调用方法:Delphi调用Java的class方法法