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!
Je ne vois pas vraiment la déclaration native de la méthode 'init' dans votre code Java. – Malcolm
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