首先,编辑java文件:
package与目录结构相符,创建com/iflytek/pcm目录,
package com.iflytek.pcm;
import android.util.Log;
public class Record {
private static final String TAG = "=============== record ==========";
//机器是否支持dsp
private static boolean mDspEable = false;
static {
System.loadLibrary("pcm-lib");
}
//4:ALOGI 3:ALOGD 2:ALOGV 1:ALOGW 0:ALOGE
//record api
private native static void nativeLogLevel(int level);
private native static int nativeStart(int channels, int rate, int period_size, int period_count);
private native static int nativeRead(byte[] audioData, byte[] audioData48k, int sizeInBytes);
private native static void nativeStop();
private native static int nativeGetSize();
private native static int nativeSetGAIN(int gain);
//play api
private native static int nativePalyOpen(int channels, int rate, int period_size, int period_count);
private native static int nativePalyStart();
private native static int nativePlayStop();
private native static int nativeSetRecordMode(int mode);
private native static void nativeSetArrayUsed(int array);
private native static void nativeSetPriority(int priority);
/**
* 将8个mic的录音文件分解成每个mic对应文件,文件名最后一位表示mic编号
* @param filePath 8个mic的录音文件
* @param wav true;表示生成wav文件,可以直接播放 false:表示生成pcm文件
* @return
*/
public static native String nativeOne2Eight(String filePath, boolean wav);
/***************************************************************************
对外提供的API,
调用顺序:
pcmRecordStart --> pcmGetSize --> pcmRead -->pcmStop
***************************************************************************/
/**
* 开始录音,主要是打开录音设备
* (目前:只有rate需要根据模式设置,rate值依据高质量音频,其他都不需要)
* @param channels
* @param rate
* @param period_size
* @param period_count
* @return
*/
public static int pcmRecordStart(final int channels, final int rate, int period_size, int period_count) {
try {
Log.e(TAG,"======================== kaka1 =====================");
if (!mDspEable) {
//设备无DSP版本
nativePalyOpen(2, rate, 1024, 4);
// TODO: 2019/2/28 稳定后,使用线程池管理
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("recordPlay");
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
nativePalyStart();
}
}).start();
}
Thread.sleep(100);
} catch (Exception e) {
Log.e(TAG,"",e);
}
return nativeStart(2, rate, 1024, 4);
}
/**
* 根据pcmRecordStart中的参数,获取对应的buffer大小
*
* @return
*/
public static int pcmGetSize() {
return nativeGetSize();
}
/**
* 读取录音数据
*
* @param audioData
* @param offsetInBytes
* @param sizeInBytes
* @return
*/
public static int pcmRead(byte[] audioData, byte[] audioData48k, int offsetInBytes, int sizeInBytes) {
return nativeRead(audioData, audioData48k, sizeInBytes);
}
/**
* 停止录音
*/
public static void pcmStop() {
nativeStop();
if (!mDspEable) {
nativePlayStop();
}
}
/**
* 设置log等级
*
* @param level 4:ALOGI 3:ALOGD 2:ALOGV 1:ALOGW 0:ALOGE
*/
public static void setLogLevel(int level) {
nativeLogLevel(level);
}
/**
* 调节增益,建议值为1和2
*
* @param gain
*/
public static void setGain(int gain) {
nativeSetGAIN(gain);
}
/**
* 根据设备设置是否支持dsp,带dsp的设备一定要设置成支持,不带dsp设备一定要设置成不支持,否则
* 无法正常工作
*
* @param value true:表示是dsp版本设备,false表示是非dsp版本设备
*/
public static void setDsp(boolean value) {
mDspEable = value;
}
/**
* 将8个mic的录音文件分解成每个mic对应文件,文件名最后一位表示mic编号
*
* @param filePath 8个mic的录音文件
* @param wav true;表示生成wav文件,可以直接播放 false:表示生成pcm文件
* @return
*/
public static void one2Eight(String filePath, boolean wav) {
nativeOne2Eight(filePath, wav);
}
/**
* 设置录音模式
* @param mode
* 省电模式 1
采访模式 2
标准模式 3
会议模式 4
讲座模式 5
音乐模式 6
语音备忘 7
*/
public static void setRecordMode(int mode) {
nativeSetRecordMode(mode);
}
/**
* 设置设备类型
* @param array 1是sr501,2是sr701,需要在录音开启前设置
*/
public static void setArrayUsed(int array){
nativeSetArrayUsed(array);
}
/**
*录音优先级
* @param priority 1-9;值越大,优先级越高
*/
public static void setPriority(int priority)
{
nativeSetPriority(priority);
}
}
通过终端进入当前目录,执行:javac Record.java
有如下错误提示:
Record.java:32: error: unmappable character for encoding ASCII
需要将编码格式指定为utf-8, 再次编译:
javac -encoding UTF-8 Record.java
发现格式的错误没有了,又有如下新错误:
Record.java:3: error: package android.util does not exist
import android.util.Log;
^
是由于没有导入android.jar path所致,终极命令:
javac -encoding UTF-8 -classpath /home/kaka/workspace/idh/prebuilts/sdk/18/android.jar com/iflytek/pcm/Record.java
在当前目录生成了Record.class文件。
回退到根目录(com同级目录),执行:
javah -jni com.iflytek.pcm.Record
则在当前目录生成com_iflytek_pcm_Record.h文件。