javah命令为java文件生成jni层.h头文件

20 篇文章 0 订阅
15 篇文章 5 订阅

首先,编辑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文件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值