Android MediaRecorder JNI问题(德尔福)

问题描述:

我正在使用RAD Studio 10.2东京和在Delphi编程。Android MediaRecorder JNI问题(德尔福)

我对使用JNI库的Java对象有一般问题。

我想要做的是找到按钮按下之间的Android音频源的最大音频幅度。

这是我正在使用的代码。

var 
    Form1: TForm1; 
    Recorder: JMediaRecorder; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if not assigned(Recorder) then 
    begin 
    Recorder:= TJMediaRecorder.Create(); 
    Recorder.setAudioSource(1); 
    Recorder.setOutputFormat(1); 
    Recorder.setAudioEncoder(1); 
    Recorder.setOutputFile(TPath.GetTempPath+'/test'); 
    Recorder.prepare(); 
    Recorder.start(); 
    end; 
    Label1.Text:=IntToStr(Recorder.getMaxAmplitude()); 
end; 

这似乎会产生多个问题。

问题#1:

虽然我知道,在Java媒体记录的设置应该是这个样子

Recorder.setAudioSource(MediaRecorder.AudioSource.MIC). 

这不是东西,我可以在RAD Studio企业进入。我看了一下API,发现它应该是1的整数。问题是它给我一个错误,说它找不到音频源。

问题2:

我需要设置的路径使用

Recorder.setOutputFile() 

与此问题的文件是,它仅接受JStrings作为输入。我到处都找过的地方,发现谁使用

StringToJString('my super cool string') 

几个人,我认为这是我不知道的,但因为当我使用它,它不工作库的一部分。

如果您知道另一种获取Android音频源读取振幅的方法,我也会接受这个答案,因为这是我正在尝试解决的整体问题。

一般来说,在Delphi的Android JNI框架内:

  • Java类类型正在使用的前缀为TJ类在Delphi表示,并且Java对象实例使用的前缀为接口在Delphi表示J

  • 嵌套的Java类由Delphi类和接口来表示,它们以父类名后跟_后跟嵌套类名命名。

  • Java静态常量/字段/属性/方法在Delphi中表示为特殊JavaClass类属性的子属性/方法。

所以,你的情况:

  • 了Java MediaRecorder类由TJMediaRecorder类和JMediaRecorder接口表示。

  • Java MediaRecorder.AudioSource类由TJMediaRecorder_AudioSource类和JMediaRecorder_AudioSource接口表示。

  • 了Java MediaRecorder.AudioSource.MIC常数由TJMediaRecorder_AudioSource.JavaClass.MIC类属性表示:

    Recorder.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); 
    

同样的道理也适用于MediaRecorder.setOutputFormat()MediaRecorder.setAudioEncoder()方法:

Recorder.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); 
Recorder.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); 

至于串,JNI对Delphi字符串一无所知,因此您必须使用StringToJString()将Delphi字符串转换为JNI stri ngs,并使用JStringToString()将JNI字符串转换为Delphi字符串。这两个功能都在Delphi RTL中,具体取决于您使用的Delphi版本,具体为Androidapi.Helpers单元(XE6 +)或Androidapi.JNI.JavaTypes单元(XE5)。

Recorder.setOutputFile(StringToJString(TPath.Combine(TPath.GetTempPath, 'test'))); 
+0

感谢您的快速和知识的答案。你偶然知道了解这种跨语言程序设计的好资源吗?我还没有找到一个全面的来源。 – Michael

+1

@Michael这些可能有所帮助:https://www.youtube.com/watch?v = GcuYc7F0lIU,http://blog.blong.com/search/label/Android –