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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 是的,Delphi可以调用Java接口。 Delphi是一种编程语言和集成开发环境,主要用于Windows平台的应用程序开发。Java是一种面向对象的编程语言,广泛用于开发跨平台的企业级应用程序。 Java接口是一种定义了一组方法的抽象类型,用于实现类之间的约定。通过接口,我们可以实现类的多态性和代码的复用。 在Delphi中,我们可以使用JNI(Java Native Interface)来调用Java接口。JNI允许我们在Delphi应用程序中使用Java类和接口,通过这种方式,我们可以与Java平台进行交互。 要调用Java接口,我们首先需要将Java代码编译为Java类文件,并使用Java编译器生成带有C风格函数原型的动态链接库(DLL)。 然后,在Delphi中,我们使用LoadLibrary函数加载DLL,并使用GetProcAddress函数获取Java接口中的函数的地址。 接下来,我们可以使用JVM创建Java虚拟机,并通过调用接口方法来实现与Java交互。需要注意的是,我们需要将接口方法的参数和返回值类型转换为Delphi相应的类型。 在调用Java接口时,我们可以传递参数,并获取方法的返回值。通过这种方式,我们可以利用Delphi的强大功能和Java的跨平台优势进行开发。 总结而言,Delphi可以调用Java接口,通过JNI实现与Java的交互。这种跨平台的互操作性为开发者提供了更加灵活和强大的开发选择。 ### 回答2: Delphi是一种基于Object Pascal语言的集成开发环境(IDE),主要用于Windows平台上的应用程序开发。它提供了广泛的库和工具,可以快速开发各种类型的应用程序。 虽然DelphiJava是两种不同的编程语言,但Delphi可以通过使用Java Native Interface(JNI)来调用Java接口。JNI是一种允许不同编程语言互相调用的机制,它提供了Java和其他编程语言之间的桥梁。 在Delphi调用Java接口可以通过以下几个步骤完成: 1. 编写Java接口:首先,在Java中编写一个接口,定义要在Delphi调用方法和参数。 2. 使用Java编译器:将编写的Java接口编译成字节码文件(.class文件)。 3. 使用Delphi的JNI支持:在Delphi的代码中,使用JNI支持库(如Jvcl或JVCL)来加载Java的字节码文件,并将其转换为Delphi可以调用的方式。 4. 调用Java接口方法:一旦Java接口被加载,就可以在Delphi中使用其方法调用Java代码。 通过这种方式,Delphi可以与Java进行交互,调用Java接口中定义的方法,并传递参数。这对于需要在Delphi应用程序中使用Java库或与其他Java应用程序进行通信的开发人员来说非常有用。 总结起来,Delphi可以通过JNI机制来调用Java接口,从而实现与Java的交互和通信。这为开发人员提供了更广泛的工具和库选择,加快了应用程序的开发速度和灵活性。 ### 回答3: 是的,Delphi可以通过使用Java Native Interface (JNI) 来调用Java接口。JNI 是Java平台提供的一种机制,它允许Java代码和非Java代码(如C++或Delphi)进行交互。 要在Delphi调用Java接口,需要进行以下步骤: 1. 创建一个Java类,并在其中定义接口方法。 2. 使用Java编译器将该类编译为一个.jar文件。 3. 在Delphi中导入Java类库,可以使用Java Importer工具或JNI API进行导入。 4. 建立连接和协议,使Delphi能够调用Java方法。可以使用JNI API提供的函数来创建并连接到Java虚拟机(JVM)。 5. 在Delphi中编写代码,调用Java接口方法。 6. 运行Delphi应用程序,即可实现调用Java接口。 通过这种方式,Delphi程序可以利用Java所提供的各种功能和接口,而无需重新编写Java代码。这样可以提高开发效率和软件的复用性。 注意,为了确保调用的正确性和可靠性,必须仔细处理数据类型转换和参数传递等问题。 总之,Delphi通过JNI可以调用Java接口,并且可以从Java程序中获得所需的功能和特性。这使得Delphi开发人员能够利用Java丰富的生态系统,扩展和增强他们的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值