UnsatisfiedLinkError при попытке загрузить библиотеку, которая явно существует

1

Я использую prebuilt libs (libsox.so и др.), И я использую небольшой тестовый файл для интерфейса JNI (sox-test-jni.so). Я пытаюсь загрузить "sox" и "sox-test-jni" через System.loadLibrary, и я получаю UnsatisfiedLinkError во время выполнения.

Я ранее строил libsox.so и другие с NDK.

Когда я запускаю ndk-build, все кажется прекрасным, и все необходимые файлы помещаются в libs/armeabi-v7a/

При запуске моего Java-приложения на телефоне ошибка:

Cannot load library: link_image[1963]:  1413 could not load needed library 'liblpc10.so' for 'libsox.so' (load_library[1105]: Library 'liblpc10.so' not found)

По-видимому, он находит libsox.so просто отлично, но не может найти liblpc10.so, который живет рядом с ним.

Это libs в моем файле APK - в libs/armeabi-v71/

libffmpeg.so
libFLAC.so
libfmemopen.so
libgsm.so
liblpc10.so
libmad.so
libmp3lame.so
libogg.so
libplayer.so
libpng.so
libsmr.so
libsmrx.so
libsndfile.so
libsox.so
libsox-test-jni.so
libvorbis.so
libvorbisenc.so
libvorbisfile.so
libwavpack.so

Вот мой Android.mk для JNI.

http://pastebin.com/raw.php?i=dcSijYSv

Здесь моя Java:

package roman10.ffmpegTest;

import android.app.ListActivity;
import android.widget.AbsListView;
import android.widget.ListView;

public class VideoBrowser extends ListActivity implements ListView.OnScrollListener {

  //load the native library
  static {
      System.loadLibrary("sox");
      System.loadLibrary("sox-test-jni");
    }

    @Override
    public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    } 
}
  • 0
    Можете ли вы показать код Java. Я думаю, что вы должны попробовать это без расширения .so файла. удачи.
  • 0
    Обновлено с помощью кода Java
Теги:
android-ndk
jni

3 ответа

1
Лучший ответ

Похоже, мне нужно явно указать Java для загрузки любых зависимостей. Он не будет определять их самостоятельно, даже если он знает, что хочет "liblpc10.so", он не будет автоматически загружать его.

  System.loadLibrary("ffmpeg");
  System.loadLibrary("ogg");
  System.loadLibrary("lpc10");
  System.loadLibrary("gsm");
  System.loadLibrary("vorbis");
  System.loadLibrary("vorbisenc");
  System.loadLibrary("vorbisfile");
  System.loadLibrary("FLAC");
  System.loadLibrary("fmemopen");
  System.loadLibrary("mad");
  System.loadLibrary("mp3lame");
  System.loadLibrary("smr");
  System.loadLibrary("png");
  System.loadLibrary("smrx");
  System.loadLibrary("sndfile");
  System.loadLibrary("wavpack");      
  System.loadLibrary("sox");
  System.loadLibrary("sox-test-jni");
1

Попробуй это:

static {
   try{
      System.loadLibrary("ffmpeg-prebuilt");// ffmpeg in some code as android.mk module name
      System.loadLibrary("ffmpeg-test-jni");
   }
   catch (UnsatisfiedLinkError e) {
       Log.e("Error..1", e.toString());
   }
}
0

Android.mk используется для компиляции исходного кода, а не скомпилированных.so's:

#AMR
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := amr
LOCAL_C_INCLUDES := amr/c
LOCAL_SRC_FILES :=  \
    amr/c/sp_enc.cpp \
    amr/c/interf_enc.cpp \
    amr/c/interf_dec.cpp \
    amr/c/sp_dec.cpp \
    amr/amr.cpp
TARGET_ARCH_ABI := armeabi-v7a
include $(BUILD_SHARED_LIBRARY)

Если вы просто загружаете библиотеку загрузки, а не включаете ее в процедуру компиляции, вы должны иметь лучший результат. Кроме того, возможно, вы можете попробовать переименовать библиотеки? Я столкнулся с проблемой сбоя телефона, потому что я загружал библиотеку с именем "mss", когда на самом деле была библиотека с таким именем уже по телефону. (Переименование моей библиотеки позаботилось об этой проблеме.)

  • 0
    Ну, я все еще собираю свой sox-test-jni.c.
  • 1
    Хорошо, что вы нашли ответ!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню