UnsatisfiedLinkError при попытке загрузить библиотеку, которая явно существует - PullRequest
1 голос
/ 20 декабря 2011

Я использую готовые библиотеки (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) {
    } 
}

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Похоже, мне нужно явно указать 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 голос
/ 17 февраля 2012

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

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 голосов
/ 20 декабря 2011

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», когда на самом деле уже существовала библиотека с таким именем на телефоне.(Переименование моей библиотеки решило эту проблему.)

...