首页 > 代码库 > 世界上最恶心的调用方法: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方法法