2017-08-09 105 views
4

我对Delphi的编程还很新,我对Java没有任何了解。但是,我需要使用RAD Studio编写一个程序来读取音频输入的幅度。我无法找到一种方法来做到这一点在德尔福(我可以负担得起),但我确实找到了一种使用Android API的方式。该解决方案看起来在MediaRecorder对象中,所以我试图用这个代码来使用它。如何使用JNI实例化Java对象(Delphi)

var 
    Form1: TForm1; 
    RecorderObj: Jobject; 
    Recorder: JMediaRecorder; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Recorder:= MediaRecorder; // <------- The problem is here. 
    Recorder.setAudioSource(1); // should set the recording device to the mic 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Label1.Text:= IntToStr(Recorder.getMaxAmplitude); 
end; 

它看起来这个代码不起作用,因为没有对象的实例。然而,记录器:=新的MediaRecorder()(android想要它的方式)不起作用,也没有记录器:= MediaRecorder.Create(我认为德尔福通常想要它的方式)如果有人知道如何获得对象的实例或知道从Delphi/RAD Studio获取音频振幅的更简单的方法,请让我知道。

+2

记录:= TJMediaRecorder.JavaClass.init;另外看看FMX.Media.Android单元,它包含不同类的媒体捕获 –

+0

@DalijaPrasnikar:这应该是一个答案,而不是评论。 –

+0

@DalijaPrasnikar:答案不必很长,只是正确的。 '记录器:= TJMediaRecorder.JavaClass.init;' - 这是一个相当完整(和正确)的答案给我:-)给自己信用。 –

回答

2

为了在Delphi中创建一个Java类对象实例,你的情况实现了JMediaRecorder接口的类的实例,使用下面的代码:

Recorder := TJMediaRecorder.JavaClass.init; 
+2

我也见过像'Recorder:= TJMediaRecorder.Create;'这样的语法,它可能也适用于Delphi的某些版本。但是,通常调用'JavaClass.init()'调用实际的Java类构造函数。如果Java类构造函数接受任何参数,那么'init()'匹配。 –