世界上最恶心的调用方法: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:[email protected];

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;

时间: 2024-08-03 03:06:20

世界上最恶心的调用方法:Delphi调用Java的class方法法的相关文章

用eclipse 检索SVN 上 myEclipse 建的web项后,成java项目解决方法

在网上找了非常多,都无论用. 说添加.project 文件几个属性.但我发现里面都有,在我这里无论什么用. 最后还是自已搞成了! 首先在eclips上建一个新的java web 项目.拷贝新建的web项目下的  [.settings]目录以下全部的文件.到检索下来的java 项目里,把之前的全干掉! 这样一看就成了web 项目.但公布不了webRootj里面的东东 1,改动项目 文件夹下的>>>>.settings 文件夹下的     >>文件:.jsdtscope  

HDU 4515 小Q系列故事——世界上最遥远的距离

#include <iostream> #include <cmath> #include <algorithm> using namespace std; void moniadd(int y,int m,int d) { if (m > 12) { y++; m -= 12; } if (d>31) { if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12) { d -= 31; } els

hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1751    Accepted Submission(s): 628 Problem Description 世界上最遥远的距离 不是生与死 而是我就站在你面前 你却不知道我爱你 世界上最遥远的距离 不是我就站在你面前你却不知道我爱你 而是明明知道彼此相爱

Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)

相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/article/details/8764165 注意事项: 1.生成WSDL文件时,D7可能有的无法生成,用XE版本可以全部生成. 返回字节流: 1 function GetByte(AString: string): TByteDynArray; 2 var 3 sByte: TByteDynArray;

[转]Delphi调用cmd的两种方法

delphi调用cmd的两种方法vars:string;begins:='cmd.exe /c '+edit1.Text+' >c:\1.txt';winexec(pchar(s),sw_hide);sleep(2000);memo1.Lines.LoadFromFile('c:\1.txt'); 2shellexecute(handle,nil,'cmd.exe',pchar(form2.edit1.text),nil,sw_hide);WinExec主要运行EXE文件.如:WinExec(’

fastscript调用delphi方法和DELPHI调用FASTSCRIPT方法

fastscript调用Delphi过程:  1. 先创建事件处理方法:TfsCallMethodEvent 2. 然后再用调用TfsScript.AddMethod方法,第一个参数为Delphi方法的语法,第二个参数为TfsCallMethodEvent链接的一个句柄. 如在Delphi有一个过程为DelphiFunc, ….. procedure TForm1.DelphiFunc(s: String; i: Integer);  begin    ShowMessage(s + ', ' 

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题

(转)Delphi 调用C#编写的WebService 参数为Null解决方法 附中文乱码问题 //add-------to support UTF-8     RIO.HTTPWebNode.UseUTF8InHeader := true;  //添加该行,指定采用UTF-8代码传输     RIO.Converter.Encoding:='UTF-8';     RIO.Converter.Options:=RIO.Converter.Options + [soUTF8InHeader,so

java虚拟机之方法调用(上)

前言 我们都知道,面象对象的几大特性:封装,继承,多态. 其实在面试过程中也是经常被问到这个问题的.那么问题来了,java虚拟机是如何实现多态的? 其实在java虚拟机中,说到多态的实现,就不得不说说方法调用了. 方法调用概念 方法调用并不等于方法执行,方法调用阶段唯一的任务是确定被调用方法的版本(其实就是调用哪一个方法).我们都知道,Class文件的编译过程中不包含c语言编译中的连接步骤,一切方法调用在Class文件里面都是符号引用,并不是java运行时的入口地址(这里也侧面印证了上一篇文章里

Element-ui的气泡框如何在@onConfirm方法中调用元素上特定的值

缘由:想做一个删除按钮有提示,然后纠结了半天还是用了Element-ui的气泡框.首先修改了<el-button>的padding来修改按钮大小. 效果: 然后问题是要通过删除后的气泡框的确认事件来删除某个收藏夹,但是如何动态获取这个数据呢?我人傻,还是像用ev.currentTarget.dataset.xx的方法,过了1个多小时才发觉这个方法是放在element-ui的标签上的,它是被封装过的,一加载所有元素都变化了. 然后又过了半小时,我想到可以利用<el-button>的方