小白android用ndk、jni录音mp3格式

1、下NDK并配置环境变量

2、配置JNI,具体参考http://blog.csdn.net/shimiso/article/details/43447785

3、配置自己的运行.h和.c文件以及util文件

#include "lame.h"
#include "com_eachpal_audio_MyLameUtil.h"
#include <stdio.h>
#include <jni.h>

static lame_global_flags *lame = NULL;

JNIEXPORT void JNICALL Java_com_eachpal_audio_MyLameUtil_init(
		JNIEnv *env, jclass cls, jint inSamplerate, jint inChannel, jint outSamplerate, jint outBitrate, jint quality) {
	if (lame != NULL) {
		lame_close(lame);
		lame = NULL;
	}
	lame = lame_init();
	lame_set_in_samplerate(lame, inSamplerate);
	lame_set_num_channels(lame, inChannel);//输入流的声道
	lame_set_out_samplerate(lame, outSamplerate);
	lame_set_brate(lame, outBitrate);
	lame_set_quality(lame, quality);
	lame_init_params(lame);
}

JNIEXPORT jint JNICALL Java_com_eachpal_audio_MyLameUtil_encode(
		JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,
		jint samples, jbyteArray mp3buf) {
	jshort* j_buffer_l = (*env)->GetShortArrayElements(env, buffer_l, NULL);

	jshort* j_buffer_r = (*env)->GetShortArrayElements(env, buffer_r, NULL);

	const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf);
	jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL);

	int result = lame_encode_buffer(lame, j_buffer_l, j_buffer_r,
			samples, j_mp3buf, mp3buf_size);

	(*env)->ReleaseShortArrayElements(env, buffer_l, j_buffer_l, 0);
	(*env)->ReleaseShortArrayElements(env, buffer_r, j_buffer_r, 0);
	(*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0);

	return result;
}

JNIEXPORT jint JNICALL Java_com_eachpal_audio_MyLameUtil_flush(
		JNIEnv *env, jclass cls, jbyteArray mp3buf) {
	const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf);
	jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL);

	int result = lame_encode_flush(lame, j_mp3buf, mp3buf_size);

	(*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0);

	return result;
}

JNIEXPORT void JNICALL Java_com_eachpal_audio_MyLameUtil_close
(JNIEnv *env, jclass cls) {
	lame_close(lame);
	lame = NULL;
}

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_eachpal_audio_MyLameUtil */

#ifndef _Included_com_eachpal_audio_MyLameUtil
#define _Included_com_eachpal_audio_MyLameUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_eachpal_audio_MyLameUtil
 * Method:    init
 * Signature: (IIIII)V
 */
JNIEXPORT void JNICALL Java_com_eachpal_audio_MyLameUtil_init
  (JNIEnv *, jclass, jint, jint, jint, jint, jint);

/*
 * Class:     com_eachpal_audio_MyLameUtil
 * Method:    encode
 * Signature: ([S[SI[B)I
 */
JNIEXPORT jint JNICALL Java_com_eachpal_audio_MyLameUtil_encode
  (JNIEnv *, jclass, jshortArray, jshortArray, jint, jbyteArray);

/*
 * Class:     com_eachpal_audio_MyLameUtil
 * Method:    flush
 * Signature: ([B)I
 */
JNIEXPORT jint JNICALL Java_com_eachpal_audio_MyLameUtil_flush
  (JNIEnv *, jclass, jbyteArray);

/*
 * Class:     com_eachpal_audio_MyLameUtil
 * Method:    close
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_eachpal_audio_MyLameUtil_close
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

package com.eachpal.audio;

/**
 * Created by eachpal on 2016/7/20.
 */
public class MyLameUtil {
    static{
        System.loadLibrary("mp3lame");
    }

    /**
     * Initialize LAME.
     *
     * @param inSamplerate
     *            input sample rate in Hz.
     * @param inChannel
     *            number of channels in input stream.
     * @param outSamplerate
     *            output sample rate in Hz.
     * @param outBitrate
     *            brate compression ratio in KHz.
     * @param quality
     *            <p>quality=0..9. 0=best (very slow). 9=worst.</p>
     *            <p>recommended:</p>
     *            <p>2 near-best quality, not too slow</p>
     *            <p>5 good quality, fast</p>
     *            7 ok quality, really fast
     */
    public native static void init(int inSamplerate, int inChannel,
                                   int outSamplerate, int outBitrate, int quality);

    /**
     * Encode buffer to mp3.
     *
     * @param bufferLeft
     *            PCM data for left channel.
     * @param bufferRight
     *            PCM data for right channel.
     * @param samples
     *            number of samples per channel.
     * @param mp3buf
     *            result encoded MP3 stream. You must specified
     *            "7200 + (1.25 * buffer_l.length)" length array.
     * @return <p>number of bytes output in mp3buf. Can be 0.</p>
     *         <p>-1: mp3buf was too small</p>
     *         <p>-2: malloc() problem</p>
     *         <p>-3: lame_init_params() not called</p>
     *         -4: psycho acoustic problems
     */
    public native static int encode(short[] bufferLeft, short[] bufferRight,
                                    int samples, byte[] mp3buf);

    /**
     * Flush LAME buffer.
     *
     * REQUIRED:
     * lame_encode_flush will flush the intenal PCM buffers, padding with
     * 0's to make sure the final frame is complete, and then flush
     * the internal MP3 buffers, and thus may return a
     * final few mp3 frames.  'mp3buf' should be at least 7200 bytes long
     * to hold all possible emitted data.
     *
     * will also write id3v1 tags (if any) into the bitstream
     *
     * return code = number of bytes output to mp3buf. Can be 0
     * @param mp3buf
     *            result encoded MP3 stream. You must specified at least 7200
     *            bytes.
     * @return number of bytes output to mp3buf. Can be 0.
     */
    public native static int flush(byte[] mp3buf);

    /**
     * Close LAME.
     */
    public native static void close();
}


4、android.mk后面加上自己的.c文件名

5、jni目录运行cmd命令:ndk-build生成so文件

6、删除多余的armeabi文件夹


问题处理:

1、未添加自己的.h和.c会找不到util文件里的方法

2、不删除多余的armeabi会报错:UnsatisfiedLinkError

猜你喜欢

转载自blog.csdn.net/qq_28714343/article/details/51984996
今日推荐