如何使用JNI(Delphi)实例化Java对象

4

我对Delphi编程还很陌生,对Java也不了解。但是,我需要使用RAD Studio编写一个程序,可以读取音频输入的振幅。我无法找到Delphi中实现这一功能的方法(我能负担得起的),但我在Android API中找到了一种方法。解决方案似乎在MediaRecorder对象中,因此我尝试使用以下代码:

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;

在我看来,这段代码无法工作是因为没有对象实例。然而,Recorder:= new MediaRecorder()(安卓想要的方式)也不起作用,Recorder:= MediaRecorder.Create(我认为 Delphi 通常想要的方式)也不行。如果有人知道如何获取对象实例或者知道从 Delphi/RAD Studio 更容易获取音频振幅的方法,请告诉我。


2
录音机 := TJMediaRecorder.JavaClass.init; 还要看一下 FMX.Media.Android 单元,它包含了不同的媒体捕获类。 - Dalija Prasnikar
@DalijaPrasnikar:那应该是一个答案,而不是一个评论。 - Remy Lebeau
@DalijaPrasnikar:答案不必很长,只需正确。Recorder := TJMediaRecorder.JavaClass.init; - 对我来说这是一个相当完整(且正确)的答案 :-) 要给自己点信心。 - Remy Lebeau
@RemyLebeau 如果你坚持 :) - Dalija Prasnikar
@DalijaPrasnikar 感谢您的帮助,我已经被卡在这里太久了。 - Michael
1个回答

2

要在Delphi中创建一个Java类对象实例,对于你的情况,即实现JMediaRecorder接口的类的实例,请使用以下代码:

Recorder := TJMediaRecorder.JavaClass.init;

2
我也看到过类似 Recorder := TJMediaRecorder.Create; 的语法,这在某些 Delphi 版本中可能也有效。但是一般来说,调用 JavaClass.init() 就是在调用实际的 Java 类构造函数。如果一个 Java 类构造函数需要任何参数,那么 init() 也会相应地匹配。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接