android - 无法链接 libSTLport_shared,即使它存在...?

标签 android c++ shared-libraries android-ndk

我正准备开始用头撞墙。我已经阅读了我能找到的关于这个问题的每一个 SO 线程,阅读了关于这个问题的每一个谷歌结果,但找不到下蹲。我正在构建一个 android 应用程序,我在其中用 C++ 编写了一个 2D 引擎,并且我正在使用 STLport 的共享版本和 NDK r6b。生成 libSTLport_shared 的 .so 文件并成功复制到我的 libs 文件夹中。我什至在设备上使用 adb shell 检查并正确复制了 .so 文件。

我尝试了各种解决方案,例如修改我的 .mk 文件以明确声明 libSTLport_shared.so 为必需模块。在编译期间,一切顺利,它显示在 APK 中,并成功复制到设备。但是我收到此错误:

09-17 17:35:26.450: DEBUG/dalvikvm(19277): Trying to load lib /data/data/ca.ascensionsystems.mypackagename/lib/libstlport_shared.so 0x476c6f30
09-17 17:35:26.450: INFO/dalvikvm(19277): Unable to dlopen(/data/data/ca.ascensionsystems.mypackagename/lib/libstlport_shared.so): Cannot load library: link_image[1995]: failed to link libstlport_shared.so
09-17 17:35:26.450: WARN/dalvikvm(19277): Exception Ljava/lang/UnsatisfiedLinkError; thrown during Lca/ascensionsystems/mypackagename/Ascengine;.<clinit>
09-17 17:35:26.450: WARN/dalvikvm(19277): threadid=8: thread exiting with uncaught exception (group=0x40025a70)
09-17 17:35:26.470: VERBOSE/WindowManager(4837): Remove Window{479ca678 Starting ca.ascensionsystems.mypackagename paused=false}: mSurface=Surface(name=Starting ca.ascensionsystems.mypackagename, identity=90) mExiting=false isAnimating=true app-animation=android.view.animation.AnimationSet@4794fa10 inPendingTransaction=false mDisplayFrozen=false
09-17 17:35:26.470: ERROR/WindowManager(4837): return in removeWindowLocked
09-17 17:35:26.490: ERROR/AndroidRuntime(19277): FATAL EXCEPTION: GLThread 9
09-17 17:35:26.490: ERROR/AndroidRuntime(19277): java.lang.ExceptionInInitializerError
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at ca.ascensionsystems.mypackagename.GL2JNIView$Renderer.onSurfaceChanged(GL2JNIView.java:336)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1327)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277): Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at java.lang.Runtime.loadLibrary(Runtime.java:461)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at java.lang.System.loadLibrary(System.java:557)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     at ca.ascensionsystems.mypackagename.Ascengine.<clinit>(Ascengine.java:26)
09-17 17:35:26.490: ERROR/AndroidRuntime(19277):     ... 3 more
09-17 17:35:26.500: WARN/ActivityManager(4837):   Force finishing activity ca.ascensionsystems.mypackagename/.mypackagenameActivity

请注意,我用“mypackagename”替换了我的真实包名称,以免泄露我即将推出的游戏的 super secret 名称。 :) 另请注意,Ascengine 是另一个 .SO,我的主要应用程序 SO,它是我的 2D 引擎。

有人遇到过这样的问题吗?有任何想法吗?另请注意,我在 libSTLport_shared 上做了一个 objdump 来检查它的 deps。我使用 DDMS 确认它们存在于我的设备上,甚至在尝试加载 libSTLport_shared 之前将它们显式加载到我的 java 代码中。没有区别。提前致谢!

还有

这是问题的第二个可选组成部分。我想到但尚未尝试的一种解决方案是使用 System.load(absolutePathToLibrary) 但我找不到如何在 java 中生成此路径。出于显而易见的原因,我不想对其进行硬编码。再次感谢!

最佳答案

好吧,看来我找到了某种解决方案。我基本上只是放弃使用共享版本的 STL 端口并切换到静态。然后我使用 Application.mk 标志重建静态版本:STLPORT_FORCE_REBUILD := true

但是,我仍然遇到奇怪的问题。它编译一次并安装得很好。然后我做了一个清理并重新编译/部署,它会很好地完成构建,然后告诉我我的应用程序在对话框中有错误但实际上在 Eclipse 中没有。我退出了 eclipse,重新启动它,清理并重建它,现在一切正常。似乎最新的 NDK 存在一些错误/问题......希望在 NDK r7 进行完整的 STL 移植时能够修复异常等。

关于android - 无法链接 libSTLport_shared,即使它存在...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7456699/

相关文章:

shared-libraries - 使用 GNU libtool 创建静态库和共享库?

Android 工作线程和应用程序生命周期

android - 如何在Android中处理不同的JAVA版本?

c++ - Opencv C++ 创建一个 Mat of Mats

c++ 迭代器数组的奇怪行为

c++ - 将引用返回值分配给非引用变量

java - 为什么随机按钮游戏在第一次点击后有缺陷?

安卓 "attempted to access a cursor after it has been closed"

android - 为 Qt for Android 目标构建 SMTP 客户端

linux - 在运行时读取加载的共享对象的 ELF header