Я использую 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) {
}
}
Похоже, мне нужно явно указать 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");
Попробуй это:
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());
}
}
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", когда на самом деле была библиотека с таким именем уже по телефону. (Переименование моей библиотеки позаботилось об этой проблеме.)