Android 中的错误 FFmpeg



我正在使用FrameGrabber从SD卡加载视频并执行一些图像处理操作。我按照JavaCV站点的教程加载javacc和ffmpeg。目前,要运行该应用程序,我正在使用连接到我的平板电脑的平板电脑(华硕TF 101G和Android版本4.0.3),并且工作正常。但是,如果我尝试在另一台设备(例如带有Android 4.1.2的Nexus)上运行相同的应用程序,则会出现以下错误:

02-01 16:51:54.687: E/AndroidRuntime(2839): FATAL EXCEPTION: main
02-01 16:51:54.687: E/AndroidRuntime(2839): java.lang.ExceptionInInitializerError
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacv.FFmpegFrameGrabber.<init>(FFmpegFrameGrabber.java:104)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.example.com.uniud.avires.MainActivity.onCreate(MainActivity.java:92)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.Activity.performCreate(Activity.java:5008)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.os.Looper.loop(Looper.java:137)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.reflect.Method.invokeNative(Native Method)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.reflect.Method.invoke(Method.java:511)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at dalvik.system.NativeStart.main(Native Method)
02-01 16:51:54.687: E/AndroidRuntime(2839): Caused by: java.lang.ExceptionInInitializerError
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.Class.classForName(Native Method)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.Class.forName(Class.java:217)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacpp.Loader.load(Loader.java:338)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacv.cpp.avcodec.<clinit>(avcodec.java:86)
02-01 16:51:54.687: E/AndroidRuntime(2839):     ... 16 more
02-01 16:51:54.687: E/AndroidRuntime(2839): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 26325 could not load needed library 'libavutil.so' for 'libjniavutil.so' (load_library[1093]: Library 'libavutil.so' not found)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.Runtime.load(Runtime.java:340)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at java.lang.System.load(System.java:521)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:422)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacpp.Loader.load(Loader.java:372)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacpp.Loader.load(Loader.java:319)
02-01 16:51:54.687: E/AndroidRuntime(2839):     at com.googlecode.javacv.cpp.avutil.<clinit>(avutil.java:75)
02-01 16:51:54.687: E/AndroidRuntime(2839):     ... 20 more

有什么建议吗?

我还想附加我的 Android.mk 文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include C:/Users/Marco/Desktop/new_ADT/adt-bundle-windows-x86_64/OpenCV-2.4.3.2-android-sdk/sdk/native/jni/OpenCV.mk
OPENCV_INSTALL_MODULES:=on
#OPENCV_CAMERA_MODULES:=on
LOCAL_MODULE    := udmodule
LOCAL_SRC_FILES := udjni.cpp
LOCAL_LDLIBS +=  -llog -ldl
include $(BUILD_SHARED_LIBRARY)

和我的 Apllication.mk 文件

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a 
#APP_ABI := all
APP_PLATFORM := android-8

有什么建议吗?谢谢

我也尝试以这种方式更改 application.mk 文件,但没有结果:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi
LOCAL_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mfpu=neon
LOCAL_LDLIBS += -Wl,--fix-cortex-a8
APP_PLATFORM := android-8

交叉引用 www.phonearena.com 我猜你的平板电脑使用的是NVIDIA Tegra 2处理器,但Nexus使用的是Tegra 3处理器。

我假设您复制了 lib 目录中的 .so 文件。 你可以在这里看看OpenCV4Android - 它打包为可以安装的apk文件,所以你不必担心.so文件正在为您的平台编译。

NVIDIA 也有在 Tegra 处理器上运行 OpenCV 的说明。

希望有帮助。

原因:java.lang.UnsatisfiedLinkError:无法加载库:link_image[1891]:26325无法为"libjniavutil.so"加载所需的库"libavutil.so"(load_library[1093]:找不到库"libavutil.so")

看起来你叫错了文件名?

未找到库"libavutil.so"

应使用以下代码调用文件 *.so:

static {
       System.loadLibrary("libavutil");
}

最新更新