我已经用 libstagefright 编译了 ffmpeg
最后,在链接时我使用下面的方法得到了 undefined reference
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffsft1.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffsft1.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lstdc++ -lx264 -lmedia -lutils -lstagefright -lbinder --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/$CPU/libgcc.a
引用this我修改如下
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -soname libffsft1.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffsft1.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lstdc++ -lx264 -lmedia -lutils -lstagefright -lbinder --warn-once --dynamic-linker=/system/bin/linker $NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libgnustl_shared.so $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/$CPU/libgcc.a
在哪里
CPU=armv7-a
PREFIX=./android/$CPU
NDK=~/Android/android-ndk-r7c
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
现在我得到了 .so 文件,但是在 Android 中使用它时,我得到了
03-11 03:26:35.760: E/AndroidRuntime(24036): at dalvik.system.NativeStart.main(Native Method)
03-11 03:26:35.760: E/AndroidRuntime(24036): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1892]: 1908 could not load needed library 'libgnustl_shared.so' for 'libffsft1.so' (load_library[1094]: Library 'libgnustl_shared.so' not found)
03-11 03:26:35.760: E/AndroidRuntime(24036): at java.lang.Runtime.loadLibrary(Runtime.java:370)
03-11 03:26:35.760: E/AndroidRuntime(24036): at java.lang.System.loadLibrary(System.java:535)
那么我应该复制所需的库并使用 System.loadlibrary
加载它吗?还是我做错了?
为了您的引用,我添加了未链接时得到的 undefined reference $NDK/sources/cxx-STL/gnu-libstdc++/libs/armeabi-v7a/libgnuSTL_shared.so
libavcodec/libavcodec.a(libstagefright.o):In function `std::_Rb_tree_const_iterator<std::pair<long long const, TimeStamp> >::operator--()':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:274: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)'
libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree<long long, std::pair<long long const, TimeStamp>, std::_Select1st<std::pair<long long const, TimeStamp> >, std::less<long long>, std::allocator<std::pair<long long const, TimeStamp> > >::_M_insert_(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*, std::pair<long long const, TimeStamp> const&)':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:923: undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'
libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree_const_iterator<std::pair<long long const, TimeStamp> >::operator++()':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:259: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)'
libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree_iterator<std::pair<long long const, TimeStamp> >::operator++(int)':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:192: undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)'
libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree<long long, std::pair<long long const, TimeStamp>, std::_Select1st<std::pair<long long const, TimeStamp> >, std::less<long long>, std::allocator<std::pair<long long const, TimeStamp> > >::erase(std::_Rb_tree_iterator<std::pair<long long const, TimeStamp> >)':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:1387: undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'
libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree_iterator<std::pair<long long const, TimeStamp> >::operator--()':/home/Android/android-ndk-r7c/sources/cxx-stl/gnu-libstdc++/include/bits/stl_tree.h:199: undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)'
最佳答案
您是否尝试过以下方法?
将以下代码添加到 jni 文件夹中的 android 的 Application.mk 中:
jni/应用程序.mk
APP_STL := gnustl_shared
src/{你的包}
System.loadLibrary("gnustl_shared");
如果Application.mk不存在,您应该自己创建一个。
关于Android ndk 链接在 libgnuSTL_shared.so 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22317055/