【问题标题】:Android NDK & FFMPEG : findLibrary returned nullAndroid NDK 和 FFMPEG:findLibrary 返回 null
【发布时间】:2015-04-21 22:25:06
【问题描述】:

我正在使用它在 ndk 上构建 ffmpeg: roman10's android ndk r9d - ffmpeg tutorial

该链接显示如何编译,但不清楚如何使用它。有人可以指导我吗?谢谢。

从我的项目根目录进行 ndk-build 后,我能够在 libs/armeabiobj/local/armeabi.. 中生成 .so 文件。现在我得到 findLibrary returned null??现在做什么?

java.lang.UnsatisfiedLinkError: Couldn't load libavutil from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.palak.androidffmpegroman-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.palak.androidffmpegroman-2, /vendor/lib, /system/lib]]]: findLibrary returned null

        at java.lang.Runtime.loadLibrary(Runtime.java:358)
        at java.lang.System.loadLibrary(System.java:526)
        at com.palak.androidffmpegroman.MainActivity.<clinit>(MainActivity.java:175)
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1208)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

我的项目结构:

我的build_android.sh

  #!/bin/bash
NDK=$HOME/NDK/android-ndk-r10d
SYSROOT=$NDK/platforms/android-19/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
function build_one
{
sudo ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-avdevice \
    --disable-doc \
    --disable-symver \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU 
ADDI_CFLAGS="-marm"
build_one

我正在使用 Ndk r10、ffmpeg 2.5.4、ubuntu x86。

编辑:Android.mk

LOCAL_PATH:= /home/palak/NDK/ffmpeg-2.5.4/android/arm

include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-56.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-3.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-5.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-1.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

jni文件夹下的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := tutorial01
LOCAL_SRC_FILES := tutorial01.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz 
LOCAL_SHARED_LIBRARIES := avformat avcodec swscale avutil

include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.5.4/android/arm)

【问题讨论】:

  • 我只希望像这样提到的模块:LOCAL_MODULE:= libavutil 显示为.so 文件。为什么你认为应该有libffmpeg.so
  • 感谢您的光临,好的,那您下一步怎么做?我的意思是在 jni 文件夹中放什么以及如何做:ndk-build?需要一些帮助。
  • 一旦发布您的 Android.mk 文件
  • 嘿 Ramesh 我已经编辑了我的帖子。
  • 您能帮我们一个大忙吗...请在编译或制作 .so 文件时制作教程视频。嗯,过去 5 天卡住了,没有得到结果。我成功地将文件制作为 .a 但不是 .so ..请帮助我。

标签: android android-ndk ffmpeg


【解决方案1】:
LOCAL_MODULE:= libavutil

-->

LOCAL_MODULE:= avutil # libavutil.so

示例(用于工作): https://github.com/18446744073709551615/reDroid/blob/master/jni/Android.mk

更新:
再次重申:您不需要库名称中的 lib 前缀;
LOCAL_MODULE:= avutil 将为您提供 libavutil.so

其次,您将什么参数传递给 loadLibrary()?同样,对于 libavutil.so,它应该是 "avutil"

如果遇到问题,最好的方法是从 NDK 中的 hello-jni 示例开始 (your-ndk-dir/samples/hello-jni/)

/* this is used to load the 'hello-jni' library on application
 * startup. The library has already been unpacked into
 * /data/data/com.example.hellojni/lib/libhello-jni.so <== !!!!!!!!!!!!!
 * at installation time by the package manager.
 */
static {
    System.loadLibrary("hello-jni");
}

示例编译并运行后,您可以将库添加到其中并让您的东西正常工作。

【讨论】:

  • 你能简单介绍一下吗?
  • ndk-build 成功后出现异常:java.lang.UnsatisfiedLinkError: Couldn't load avutil from loader dalvik.system.PathClassLoader blah blah blah .. : findLibrary returned null
  • 这意味着找不到库。 apk里面有吗?有时在 apk 中有两个库在 lib/armeabi 中,而在 lib/armeabi-v7a 中只有一个库
  • 它们都位于我的 apk 中的 lib/armeabi 下。
  • @PalakDarji 是所有共享库都加载了吗?
【解决方案2】:

您在 ndk-build 期间使用名称 libavutil 来引用 libavutil-54.so。这很好,但运行时库仍称为 libavutil-54.so。而且你的其他模块,包括tutorial01,都知道这个名字,所以重命名为libs/armeabi也是错误的。

你需要类似的东西

static {
    System.loadLibrary("avutil-54");
    System.loadLibrary("avcodec-56");
    System.loadLibrary("avformat-56");
    System.loadLibrary("swscale-3");
    System.loadLibrary("tutorial01");
}

Android最新版本,系统会自动解析本地外部引用,调用即可

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

【讨论】:

  • 嘿亚历克斯,我设法以某种方式编译和运行我的项目.. 虽然我已经尝试了上述解决方案,但实际上问题出在我的 Android.mk 文件已解决.. 抱歉浪费你时间。非常感谢。
【解决方案3】:

更换你的

LOCAL_SHARED_LIBRARIES := avformat avcodec swscale avutil 

LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libavfilter libswresample 

在您的 Jni 文件夹中的 Android.mk 中。

然后像下面这样加载库

static {

  System.loadLibrary("avutil-54");
  System.loadLibrary("avcodec-56");
  System.loadLibrary("avformat-56");
  System.loadLibrary("swscale-3");
  System.loadLibrary("avfilter-5");
  System.loadLibrary("swresample-1");
  System.loadLibrary("tutorial01");

}

【讨论】:

  • 我以前试过这样!但这并没有太大帮助。最后,我设法通过 PREBUILT_SHARED_LIBRARY libffmpeg.so 方式运行我的项目。感谢您的努力。
  • 如果为 NDK 构建使用新的 gradle-experimental 插件会怎样?
【解决方案4】:

您确定您使用的是带有 armeabi 处理器的手机吗?在 Application.mk 文件中添加 armeabiv7,它将在 libs 文件夹中编译 armeabiv7 手机所需的文件。

APP_ABI := armeabi armeabi-v7a x86

这应该可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2022-06-15
    • 2012-06-22
    相关资源
    最近更新 更多