根据文章https://blog.youkuaiyun.com/jinauto/article/details/133957259?spm=1001.2014.3001.5502的介绍,除了AudioRecorder外,想进行更底层的对麦克风的操作,就需要OpenSL ES或AAudio了。然而这两个API都是NDK的接口,这里就需要NDK的开发了。
Android Studio NDK(Native Development Kit)是一套用于在Android应用中嵌入使用本地代码编写的组件的工具集。它允许开发人员使用C和C++等本地代码语言来实现应用的部分功能。
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具包括交叉编译器,并提供相应的mk文件隔离CPU、平台、ABI等差异。开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
使用NDK的原因包括:
- 大部分现存的开源库都是用C/C++代码编写的,使用NDK可以方便地利用这些库。
- 提高程序的执行效率,因为本地代码通常比Java代码执行效率更高。
- 便于移植,因为本地代码一般不依赖于特定的平台或处理器架构。
在某些特定场景下,使用NDK来开发Android的功能是很有价值的。例如,对于重要的核心代码保护,或者需要使用到优秀的第三方C/C++库的情况,以及需要在多个平台上移植代码或处理大量数据追求性能的场景。
网上找了一些NDK环境的搭建,都比较复杂,我这里说的我的基础环境,Ubuntu 20.04 + Android Studio Giraffe 2022.3.1 Patch 2,搭建起来非常简单。
1,打开SDK Manager > Android SDK > SDK Tools
选中NDK和CMake,点击Apply,这样就开始下载了
2,等待下载完毕,新建一个Native C++工程
3,工程建好后,等待下载完毕,就自动生成一个同时有Jave的空Activity和C++ so库代码的工程
NDK选择,File > Project Structure > Modules > NDK Version下拉选择一下
照猫画虎试着加一个返回int函数的代码
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_jin_bluerecorder_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
extern "C" JNIEXPORT jint JNICALL
Java_com_jin_bluerecorder_MainActivity_IntFromJNI(
JNIEnv* env,
jobject /* this */) {
int ret = 888;
return ret;
}
直接可以编译生成APK,运行可以成功调用C++的so库