【问题标题】:build vp8 on android在安卓上构建 vp8
【发布时间】:2011-10-03 11:32:42
【问题描述】:

我正在尝试为 Android 构建 vp8 编解码器。我使用sourcery g++运行了configure.sh脚本和armv6的makefile,成功生成了libvpx.so。之后,我编写了一个 JNI 包装器并使用 ndk-build 成功编译它。当我在 Gingerbread 智能手机上运行它时,我得到了 UnsatisfiedLinkError "libpthread.so.0 not found"。我怎样才能摆脱这个错误?

【问题讨论】:

    标签: android vp8


    【解决方案1】:

    来自http://git.chromium.org/gitweb/?p=webm/bindings.git;a=blob_plain;f=JNI/README.Android,对可读性进行了一些调整。

    1. 创建 {project}/jni 文件夹。

    2. 获取 JNI 绑定。

      git 克隆https://chromium.googlesource.com/webm/bindings

    3. 获取 libvpx。

      git 克隆https://chromium.googlesource.com/webm/libvpx

    4. 为 Android 配置 libvpx

      ./libvpx/configure --target=armv7-android-gcc --disable-examples --sdk-path={NDK的路径}

      --sdk-path 必须是绝对的。

    5. 获取 libwebm。

      cd 绑定/JNI

      git 克隆https://chromium.googlesource.com/webm/libwebm

    6. 获取 libogg。

      http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz下载ogg代码

      提取到绑定/JNI。

    7. 我们需要运行configure来生成config_types.h。

      cd libogg-1.3.0 && ./configure && cd ..

    8. 获取 libvorbis

      http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz下载vorbis代码

      提取到绑定/JNI。

    9. 获取 libyuv

      svn checkout http://libyuv.googlecode.com/svn/trunk/ libyuv-read-only

    10. 使用以下数据创建 {project}/jni/Application.mk:

      APP_ABI := armeabi-v7a
      APP_OPTIM := release
      APP_STL := gnustl_static
      APP_CPPFLAGS := -frtti
      
    11. 使用以下数据创建 {project}/jni/Android.mk:

      WORKING_DIR := $(call my-dir)
      BINDINGS_DIR := $(WORKING_DIR)/bindings/JNI
      include $(BINDINGS_DIR)/Android.mk
      
    12. 构建 JNI 代码。

      {NDK 的路径}/ndk-build

    13. 复制java代码。

      cp -R 绑定/JNI/com/google ../src/com/

    14. 添加代码以测试绑定。

      int[] major = new int[2];
      int[] minor = new int[2];
      int[] build = new int[2];
      int[] revision = new int[2];
      MkvMuxer.getVersion(major, minor, build, revision);
      String outStr = "libwebm:" +
                      Integer.toString(major[0]) + "." +
                      Integer.toString(minor[0]) + "." +
                      Integer.toString(build[0]) + "." +
                      Integer.toString(revision[0]);
      System.out.println(outStr);
      
    15. 运行应用程序。您应该会看到 libwebm 版本输出。

    16. 根据需要进行调整。 VP8 包装器位于 com.google.libvpx 命名空间中。

    【讨论】:

    • 绝妙的答案!但是 - 当我执行以下操作时,我总是在配置过程中出错。它无法实例化编译器。这是日志:无法调用编译器:/Users/yosef/Desktop/adt/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc --sysroot= /Users/yosef/Desktop/adt/ndk/sources/android/libportable/arch-arm -I/Users/yosef/Desktop/adt/ndk/sources/android/cpufeatures -mtune=cortex-a8 -O3 -fPIC -W ..你知道可能是什么原因吗?
    • 回购已移至其他位置。请更新 repo 链接以从新根目录获取 - chromium.googlesource.com
    【解决方案2】:

    这有时可能是共享库中 SONAME 的问题,请查看这篇文章。

    http://groups.google.com/group/android-ndk/browse_thread/thread/fd484da512650359

    如果你真的不需要 pthread,你可以禁用它们。

    我过去曾遇到过 .so 文件的问题,并且通过使用 .a 静态库而不是 .so 共享库避免了所有这些问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2021-03-29
      • 2013-09-16
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多