我正在尝试为 Android 构建 vp8 编解码器。我使用sourcery g++运行了configure.sh脚本和armv6的makefile,成功生成了libvpx.so。之后,我编写了一个 JNI 包装器并使用 ndk-build 成功编译它。当我在 Gingerbread 智能手机上运行它时,我得到了 UnsatisfiedLinkError "libpthread.so.0 not found"。我怎样才能摆脱这个错误?
2 回答
来自http://git.chromium.org/gitweb/?p=webm/bindings.git;a=blob_plain;f=JNI/README.Android对可读性进行了一些调整。
创建 {project}/jni 文件夹。
获取 JNI 绑定。
获取 libvpx。
为 Android 配置 libvpx
./libvpx/configure --target=armv7-android-gcc --disable-examples --sdk-path={NDK的路径}
--sdk-path
必须是绝对的。获取 libwebm。
cd 绑定/JNI
获取 libogg。
从http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz下载 ogg 代码
提取到绑定/JNI。
我们需要运行configure来生成config_types.h。
cd libogg-1.3.0 && ./configure && cd ..
获取 libvorbis
从http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz下载 vorbis 代码
提取到绑定/JNI。
获取 libyuv
svn 结帐http://libyuv.googlecode.com/svn/trunk/ libyuv-read-only
使用以下数据创建 {project}/jni/Application.mk:
APP_ABI := armeabi-v7a APP_OPTIM := release APP_STL := gnustl_static APP_CPPFLAGS := -frtti
使用以下数据创建 {project}/jni/Android.mk:
WORKING_DIR := $(call my-dir) BINDINGS_DIR := $(WORKING_DIR)/bindings/JNI include $(BINDINGS_DIR)/Android.mk
构建 JNI 代码。
{NDK 的路径}/ndk-build
复制java代码。
cp -R 绑定/JNI/com/google ../src/com/
添加代码以测试绑定。
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);
运行应用程序。您应该看到 libwebm 版本输出。
根据需要进行调整。VP8 包装器位于 com.google.libvpx 命名空间中。
这有时可能是共享库中 SONAME 的问题,请查看本文。
http://groups.google.com/group/android-ndk/browse_thread/thread/fd484da512650359
如果你真的不需要它们,你可以禁用 pthreads。
我过去曾遇到过 .so 文件的问题,并且通过使用 .a 静态库而不是 .so 共享库避免了所有这些问题