【发布时间】:2014-02-08 02:47:10
【问题描述】:
我浏览了很多关于 Android NDK 和 STLport 的资料。我有复杂的应用程序,java+native 代码,它加载 STLport(一个 c++ 标准库端口)。原始代码库在项目的“jni”子目录中的 Application.mk 中有“APP_STL := stlport_static”。导致 ld 加载静态库。在当前的 SDK/NDK 中,这导致了许多编译失败。
根据建议,尝试加载为动态库。 (在“../jni/Application.mk”中,设置“APP_STL := stlport_shared”)有了这个,我得到一个干净的编译和加载,应用程序在 Android armeabi 上运行完美- v7a 模拟器,if 我在“dalvik”虚拟机上禁用了 checkJNI。
但是一旦我启用 checkJNI,我在 libapplication.so 上得到一个“unsatisfiedLinkError”,这看起来可能是由于 STLport 被动态加载造成的。所以,我想在静态模式下加载 STLport(logcat 在其他几个库成功加载后报告这个)。在构建过程中,编译是可以的,但是我得到了两个多重定义错误,特别是:“'vtable for std::bad_exception' 的多重定义”和 'std::exception::~exception()'。 (我也尝试过使用“gnustl_static”)。
我正在使用 gcc 版本 4.3.0 并制作版本 3.81、命令行模式和围绕 build-ndk 的小型包装器,用于 android ndk-r9c,构建目标版本为 android-8,“ant”来构建.apk 文件等。
比我更熟悉 Android 的人(我是一个完全的菜鸟)可能以前见过这个。如果有,请指教。谢谢。 - 罗斯
【问题讨论】:
-
使用stlport_static会出现什么错误?我认为只要有效,您使用的是共享的还是静态的都没关系?
-
我在 Application.mk 中尝试了“APP_STL := stlport_shared”。加载干净,但“Davlik”虚拟机在加载一些库后在应用程序 libapplication.so 上因“unsatisfiedLinkError”而崩溃。原始代码库使用静态库。我在想也许静态库使用本地指针(?)所以也许静态加载修复了 dalvik unsatisfiedLinkError? (代码在 armeabi-v7a 模拟器上完美运行,“dalvik.vm.checkjni”属性设置为 false。)关于 stlport 的多重定义 std::exception() 的问题,谷歌搜索很多。现在读。这里有一个解决方案...... ;)
-
有趣...我正在使用 stlport_static 没问题,只是想知道你还在做什么而我不是。
-
我还没有尝试过,但我相信您可以通过在您的 Android.mk 文件中包含
include external/stlport/Android.mk将其构建为静态库。您可能需要更新您的 LOCAL_C_INCLUDES 并将libstlport添加到您的 LOCAL_SHARED_LIBRARIES。我会说试试看。不过,您可能需要在源代码中添加一些定义才能使其正常工作。
标签: android android-ndk stlport