1. 程式人生 > >世界上最噁心的呼叫方法: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;