【问题标题】:Android: Access AudioRecord.Builder class from JNI level similar to AudioRecordAndroid:从类似于 AudioRecord 的 JNI 级别访问 AudioRecord.Builder 类
【发布时间】:2021-08-12 16:21:50
【问题描述】:

在 JNI 级别访问 AudioRecord.Builder 的正确方法是什么?

类似于AudioRecord 类。

(jclass)jni_env->NewGlobalRef(jni_env->FindClass("android/media/AudioRecord"));

例如:

AudioRecord recorder = new AudioRecord.Builder()
         .setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)
         .setAudioFormat(new AudioFormat.Builder()
                 .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                 .setSampleRate(32000)
                 .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
                 .build())
         .setBufferSizeInBytes(2*minBuffSize)
         .build();

【问题讨论】:

  • 目的是什么?或者你想要达到什么目的,为什么?这有助于我们回答问题,目前,就像您只是想要另一种在 Java 中设置某些东西但使用 JNI 的方式,除了这样做是为了好玩之外,几乎没有其他意义。 JNI 访问本机库等,因此您不能像您期望的那样简单地将 java 代码更改为等效的 JNI。但是,您又想从中获得什么?
  • 我正在尝试在 JNI 获取 AudioRecord 实例并使用 AudioRecord.Builder#setPrivacySensitive(boolean) API .. 类似于 -- >> github.com/r3gis3r/CSipSimple/blob/…
  • 请看我更新的答案

标签: java android java-native-interface audiorecord


【解决方案1】:

除了我上面的评论,你可以很容易地找到这些类型的东西,因为 android 是开源的。

所以先看一下androidAudioRecord源码。在那里,您会注意到 AudioRecord 构造函数调用了一个名为 native_start 的方法以及其他通过 JNI 设置音频的本机方法。

进一步浏览,您将看到引用 AudioRecord.cpp 文件的注释。

cpp 文件可以在 here 找到,您可能需要确保查看与您的 android 版本匹配的文件,我刚刚从 Google 搜索中挑选了任何人。在那里,您当然会看到 AudioRecord 类如何在本地运行,以及它向 JNI 公开了哪些方法等

通过上面你基本上可以看到AudioRecordjava类本质上是和native代码交互的,这就是你想要实现的

更新:

因此,根据您的评论,您可以做到这一点。问题是我只是随机链接,所以很抱歉,也许是我的错。

如果您查看 master 分支源代码,您会找到您要查找的内容。

在主分支的AudioRecord.java 中,您会发现它在构造函数中接受AudioAttributes 类,该类进一步向下进行一些过滤,最后使用这些过滤后的音频属性调用native_setupmAudioAttributes:

您可以通过AudioRecord.java 传递到native_setupjaa 变量的踪迹进一步了解这些属性是如何在本机代码AudioRecord.cpp 中应用的,该变量映射到本机方法android_media_AudioRecord_setup

【讨论】:

  • 寻找AudioRecord.Builder类访问的FindClass方式..类似于--->> github.com/r3gis3r/CSipSimple/blob/…
  • 你试过什么? AudioAttributes 在同一个文件夹中,Builder 类是一个静态内部类,所以我认为你会做类似(jclass)jni_env->NewGlobalRef(jni_env->FindClass("android/media/AudioAttributes$Builder")) 的事情,但我不能确定,因为我自己没有测试过,但基本上你想访问 Builder 哪个是 AudioAttributes 中的一个静态类。
  • 是的,会这样检查 -->> (jclass)jni_env->NewGlobalRef(jni_env->FindClass("android/media/AudioRecord$Builder"));正在查看是否有人已经尝试过并成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2019-11-26
相关资源
最近更新 更多