我正在尝试为Android应用实施LAME,但我一直收到错误:
W/dalvikvm(2472): No implementation found for native Lcom/example/android/audio/util/LameWrapper;.init (IIIII)V
java.lang.UnsatisfiedLinkError: init
at com.example.android.audio.util.LameWrapper.init(Native Method)
at com.example.android.audio.util.LameWrapper.init(LameWrapper.java:22)
at com.example.android.audio.util.Recorder$1.run(Recorder.java:51)
我按照步骤回答了问题(Lame MP3 Encoder compile for Android)。我能够生成libmp3lame.so文件。它位于 / libs / armeabi
内我还创建了 Android.mk 文件:
LOCAL_PATH := $(call my-dir)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(CLEAR_VARS)
LAME_LIBMP3_DIR := lame-3.99.5_libmp3lame
LOCAL_MODULE := mp3lame
LOCAL_SRC_FILES := $(LAME_LIBMP3_DIR)/bitstream.c $(LAME_LIBMP3_DIR)/fft.c $(LAME_LIBMP3_DIR)/id3tag.c $(LAME_LIBMP3_DIR)/mpglib_interface.c $(LAME_LIBMP3_DIR)/presets.c $(LAME_LIBMP3_DIR)/quantize.c $(LAME_LIBMP3_DIR)/reservoir.c $(LAME_LIBMP3_DIR)/tables.c $(LAME_LIBMP3_DIR)/util.c $(LAME_LIBMP3_DIR)/VbrTag.c $(LAME_LIBMP3_DIR)/encoder.c $(LAME_LIBMP3_DIR)/gain_analysis.c $(LAME_LIBMP3_DIR)/lame.c $(LAME_LIBMP3_DIR)/newmdct.c $(LAME_LIBMP3_DIR)/psymodel.c $(LAME_LIBMP3_DIR)/quantize_pvt.c $(LAME_LIBMP3_DIR)/set_get.c $(LAME_LIBMP3_DIR)/takehiro.c $(LAME_LIBMP3_DIR)/vbrquantize.c $(LAME_LIBMP3_DIR)/version.c
include $(BUILD_SHARED_LIBRARY)
我使用 -javah 来创建 com_example_android_audio_LameWrapper.h 文件。我使用.h创建 com_example_android_audio_util_LameWrapper.c :
JNIEXPORT void JNICALL Java_com_example_android_audio_util_LameWrapper_init(
JNIEnv *env, jclass cls, jint inSamplerate, jint outChannel,
jint outSamplerate, jint outBitrate, jint quality) {
if (glf != NULL) {
lame_close(glf);
glf = NULL;
}
glf = lame_init();
lame_set_in_samplerate(glf, inSamplerate);
lame_set_num_channels(glf, outChannel);
lame_set_out_samplerate(glf, outSamplerate);
lame_set_brate(glf, outBitrate);
lame_set_quality(glf, quality);
lame_init_params(glf);
}
实际的java包装器 LameWrapper.java :
public class LameWrapper {
public static void init(int inSamplerate, int outChannel,
int outSamplerate, int outBitrate) {
init(inSamplerate, outChannel, outSamplerate, outBitrate, 7);
}
public native static void init(int inSamplerate, int outChannel,
int outSamplerate, int outBitrate, int quality);
我创建了一个“Recorder.java”对象来加载mp3lame库。记录器对象有一个“启动”方法,它调用LameWrapper中的函数。
public class Recorder {
static {
System.loadLibrary("mp3lame");
}
public void start(){
//starts a thread, sets some values
LameWrapper.init(RECORDER_SAMPLERATE, 2, RECORDER_SAMPLERATE, 32);
}
然后我在MainActivity中调用Recorder对象。
我搜索了大量的堆栈溢出并找不到答案。通常对于“未发现实现错误”,文件名称不正确。但是,我相当确定我正确地命名了包。
有人能指出我正确的方向吗?任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
我至少可以看到一个不起作用的原因:您的LOCAL_SRC_FILES
变量不包含com_example_android_audio_util_LameWrapper.c
。修复它,它应该工作。
答案 1 :(得分:0)
this可能有所帮助。
搜索此部分找不到本地LFoo的实现; .myfunc()V。