尝试加载明显存在的库时出现UnsatisfiedLinkError

时间:2011-12-19 23:08:37

标签: java android c android-ndk java-native-interface

我正在使用预建的libs(libsox.so等),我正在使用一个小的测试文件用于JNI接口(sox-test-jni.so)。我正在尝试通过System.loadLibrary加载“sox”和“sox-test-jni”,并且我在运行时遇到了UnsatisfiedLinkError。

我之前使用NDK构建了libsox.so等。

当我运行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,它就在它旁边。

这些是我的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 个答案:

答案 0 :(得分: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 :(得分: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());
   }
}

答案 2 :(得分:0)

Android.mk用于编译源代码,而不是预编译。所以:

#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”的库,实际上,手机上已经有一个名字库。 (重命名我的库负责处理这个问题。)