libgnustl_share .so的Android ndk链接失败
Android ndk link failed on libgnustl_shared.so
我已经用libstagefright编译了ffmpeg
在最后,当链接我得到未定义的引用使用下面
$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
引用它修改如下
$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
来加载它吗?还是我做错了?为了您的参考,我添加了我得到的un违抗引用,而不与$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*)'
你试过以下方法吗?
添加下面的代码到android的应用程序。Mk from jni folder:
- jni/Application.mk
APP_STL := gnustl_shared
src/{包}
System.loadLibrary("gnustl_shared");
如果应用程序。
是的,当你将你的库链接到一个共享库时,你需要复制它并使用System.loadLibrary()在你的库之前加载它,这是正确的方法。您还可以链接libgnustl_static。一个静态的,所以你不需要复制共享库并在运行时加载它。
相关文章:
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- NDK 将库与 cmake 链接
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 将 Android 上的错误与 OpenCV 3.4.0 和 NDK 链接
- Android NDK Linker (GStreamer) - 无效的链接器名称 -fuse-ld=gold.
- 在 Android Studio 中使用 NDK、Gradle 和 CMake 链接外部库
- 在NDK中启用链接时间优化时,链接器错误
- 带有静态库的Android NDK:链接器始终抛出“未定义的参考”
- 关于在 ndk r15 中的类中初始化的静态成员的不满意链接错误
- 链接每个指令集NDK的预构建库
- 使用Android NDK r11链接错误
- OpenCV Android NDK:链接器中的非系统库错误
- NDK使用STL时发生运行时链接错误
- ExceptionInInitializerError Android NDK由以下原因引起:不满足链接错误:findL
- 正在将链接器标志发送到ndk内部版本
- 如何解决库与安卓NDK链接"incompatible target"?
- 链接c++静态库与android ndk时出错(错误:无法识别文件格式)
- Android NDK CMake链接问题
- Android NDK链接V8静态库:找不到符号,但它们在那里
- libgnustl_share .so的Android ndk链接失败