Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android MediaRecorder JNI(Delphi)的问题_Java_Android_Delphi_Mediarecorder_Delphi 10.2 Tokyo - Fatal编程技术网

Java Android MediaRecorder JNI(Delphi)的问题

Java Android MediaRecorder JNI(Delphi)的问题,java,android,delphi,mediarecorder,delphi-10.2-tokyo,Java,Android,Delphi,Mediarecorder,Delphi 10.2 Tokyo,我正在使用RAD Studio 10.2 Tokyo,并在Delphi中编程 我在使用JNI库时遇到了Java对象的一般性问题 我想做的是在按下按钮之间找到Android音频源的最大音频振幅 这是我正在使用的代码 var Form1: TForm1; Recorder: JMediaRecorder; procedure TForm1.Button1Click(Sender: TObject); begin if not assigned(Recorder) then begi

我正在使用RAD Studio 10.2 Tokyo,并在Delphi中编程

我在使用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()
问题是它只接受jstring作为输入。我找遍了所有的地方,发现了一些使用

StringToJString('my super cool string')
我认为这是我不知道的库的一部分,因为当我使用它时它不工作


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

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

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

  • 嵌套的Java类由Delphi类和接口表示,这些类和接口以父类名称后接
    \uu
    和嵌套类名称命名

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

因此,在你的情况下:

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

  • Java
    MediaRecorder.AudioSource
    类由
    TJMediaRecorder\u AudioSource
    类和
    JMediaRecorder\u AudioSource
    接口表示

  • Java
    MediaRecorder.AudioSource.MIC
    常量由
    TJMediaRecorder\u 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字符串,并使用
JStringToString()
将JNI字符串转换为Delphi字符串。这两个函数都在Delphi RTL中,特别是在
Androidapi.Helpers
unit(XE6+)或
Androidapi.JNI.JavaTypes
unit(XE5)中,具体取决于您使用的Delphi版本

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

谢谢你快速而有见识的回答。您是否碰巧知道了解这种跨语言编程的好来源?我还没有找到一个全面的来源。@Michael这些可能会有所帮助:,