4

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);

mp3lame ライブラリにロードする「Recorder.java」オブジェクトを作成しました。レコーダー オブジェクトには、LameWrapper から関数を呼び出す "start" メソッドがあります。

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 オブジェクトを呼び出します。

スタックオーバーフローの多くを検索しましたが、答えが見つかりませんでした。通常、「実装が見つからないというエラー」の場合、ファイルの名前が間違っています。ただし、パッケージに正しい名前を付けたことはかなり確信しています。

誰かが私を正しい方向に向けることができますか? どんな助けでも大歓迎です。ありがとうございました!

4

2 に答える 2

1

これが機能しない理由が少なくとも 1 つあります。それは、LOCAL_SRC_FILES変数に が含まれていないことcom_example_android_audio_util_LameWrapper.cです。それを修正すると、動作するはずです。

于 2013-04-16T16:14:16.597 に答える
0

これは役立つかもしれません。

このセクションを検索 ネイティブ LFoo;.myfunc ()V の実装が見つかりません。

于 2013-12-13T07:20:32.070 に答える