我正在使用预构建的库(libsox.so 等),并且正在为 JNI 接口(interface)使用一个小的测试文件 (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
这是我用于 JNI 的 Android.mk。
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) {
}
}
最佳答案
看来我需要明确告诉 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");
关于java - 尝试加载显然存在的库时出现 UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568777/