2013-04-15 2 views
4

Je suis en train de mettre en œuvre boiteuse une application Android, mais je continue à obtenir l'erreur:Aucune mise en œuvre trouvée pour UnsatisfiedLinkError native Android Exception JNI

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) 

J'ai suivi les étapes de la réponse (Lame MP3 Encoder compile for Android). J'ai été capable de générer le fichier libmp3lame.so. Il est placé à l'intérieur /libs/armeabi

J'ai aussi créé fichier 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) 

J'ai utilisé -javah pour créer le fichier com_example_android_audio_LameWrapper.h. J'ai utilisé le .h pour créer 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); 
} 

L'enveloppe réelle 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); 

J'ai créé un objet "Recorder.java" pour charger dans le bibliothèque mp3lame. L'objet enregistreur a une méthode "start" qui appelle les fonctions de LameWrapper. Puis, j'appelle l'objet Recorder dans MainActivity.

J'ai cherché à travers beaucoup de débordement de pile et n'ai pas trouvé la réponse. Habituellement, pour l'erreur "Aucune implémentation trouvée", les fichiers sont nommés de manière incorrecte. Cependant, je suis assez certain que j'ai nommé les paquets correctement.

Quelqu'un pourrait-il me diriger dans la bonne direction? Toute aide est appréciée. Je vous remercie!

+0

Je ne vois pas vraiment la déclaration native de la méthode 'init' dans votre code Java. – Malcolm

+0

Désolé, j'ai inclus accidentellement la méthode 'encoder 'quand j'essayais d'inclure la méthode' init'. J'ai mis à jour le code en conséquence. Merci! – ShannonS

Répondre

1

Je peux voir au moins une raison pour laquelle cela ne fonctionnera pas: votre variable LOCAL_SRC_FILES n'inclut pas com_example_android_audio_util_LameWrapper.c. Corrigez cela, et cela devrait fonctionner.

+0

Merci! J'ai complètement raté ça! – ShannonS

+0

il a déjà ajouté "LOCAL_SRC_FILES" dans Android.mk où il doit ajouter cela? –

+0

@AhmadArslan Il a déjà ajouté la variable, mais son contenu est faux, ce fichier est manquant. – Malcolm

0

this peut aider.

rechercher dans cette section Aucune implémentation trouvée pour native LFoo; .myfunc() V.

Questions connexes