环境配置
为了使用在Android中使用JNI,需要配置Android NDK的环境, Android NDK 配置
设置对应的环境变量(Windows)
下载LAME
需要LAME的源文件,可以在下载官网 LAME,可能会有一些网络的问题,也可以通过百度网盘下载
网盘LAME,下载之后解压会得到LAME的源代码
创建一个 Mp3lame
目录,在目录中创建一个 jni
目录,目录结构如下:
Mp3lame
-jni
把解压之后的lame的目录中的libmp3lame
复制到 jni
目录下,将lame中include
目录中的lame.h
复制到 jni/libmp3lame
目录下,修改下面的文件
将 libmp3lame/util.h
中的 extern ieee754_float32_t fast_log2(ieee754_float32_t x);
修改为 extern float fast_log2(float x);
将 libmp3lame/set_get.h
中的 #include <lame.h>
修改为 #include "lame.h"
NDK 编译
创建Android.mk
文件,包含需要编译的源文件,将Android.mk
文件放在jni
目录下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmp3lame
LOCAL_SRC_FILES := \
./libmp3lame/bitstream.c \
./libmp3lame/encoder.c \
./libmp3lame/fft.c \
./libmp3lame/gain_analysis.c \
./libmp3lame/id3tag.c \
./libmp3lame/lame.c \
./libmp3lame/mpglib_interface.c \
./libmp3lame/newmdct.c \
./libmp3lame/presets.c \
./libmp3lame/psymodel.c \
./libmp3lame/quantize.c \
./libmp3lame/quantize_pvt.c \
./libmp3lame/reservoir.c \
./libmp3lame/set_get.c \
./libmp3lame/tables.c \
./libmp3lame/takehiro.c \
./libmp3lame/util.c \
./libmp3lame/vbrquantize.c \
./libmp3lame/VbrTag.c \
./libmp3lame/version.c \
./wrapper.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
打开终端,定位到 Mp3lame
目录,执行 ndk-build
就会开始编译
编译的过程中遇到的问题:
解决方案:
在Android.mk
中添加一个选项
LOCAL_CFLAGS = -DSTDC_HEADERS
再重新编译
编写wrapper.c 文件
使用的是 samsung 的wrapper.c 文件,将wrapper.c
文件放在 jni
目录下,这个文件提供了三个native
的方法
可以根据自己的需求修改
private native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);
private native void destroyEncoder();
private native int encodeFile(String sourcePath, String targetPath);
在工程中使用
static {
System.loadLibrary("mp3lame");
}
private native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);
private native void destroyEncoder();
private native int encodeFile(String sourcePath, String targetPath);