【问题标题】:android NDK loading a library - UnsatisfiedLinkErrorandroid NDK 加载库 - UnsatisfiedLinkError
【发布时间】:2012-01-16 22:08:14
【问题描述】:

我正在开发一个使用 libgdx 和子弹物理引擎的安卓游戏。我可以毫无问题地编译游戏,但是当我将子弹添加到游戏中时,它会因以下错误而崩溃:

.... UnsatisfiedLinkError: 无法加载项目符号:findLibrary 返回 null ...

我可以很好地编译子弹库,但是当我尝试在我的代码中使用它时它崩溃了。有趣的是,我有另一个使用子弹但没有 libgdx 的项目,它可以正常工作。有谁知道可能是什么问题?据我所知,ndk-build 只生成 .so 文件和 obj 文件夹。

看起来子弹 .so 文件不包含在 .apk 中,因此发生了崩溃。我怎样才能检查它是否是?有没有人遇到过类似的问题?

感谢您的帮助!

【问题讨论】:

  • 你可以通过解压来查看.apk

标签: android android-ndk libgdx


【解决方案1】:

我已经解决了我的问题。问题是 libgdx 在 libs 文件夹中有 armeabi 和 armeabi-v7a 文件夹,而子弹只有 armeabi。所以我删除了 armeabi-v7a,它神奇地起作用了!

【讨论】:

    【解决方案2】:

    检查传递给 System.loadLibrary 的名称是否与 .apk 文件中的 .so 名称相同。 Apk 文件实际上是一个 zip 文件 - 因此您可以将其重命名为 .zip 扩展名,解压缩并检查其中的 libs 文件夹。

    因此,如果您在 apk 文件的 libs 文件夹下有名为 libFooBar.so 的文件,那么您应该将以下名称之一传递给 loadLibary - “FooBar”、“libFooBar”或“libFooBar.so”。

    【讨论】:

      【解决方案3】:

      当我开始使用 .cpp 本机文件而不是 .c 本机文件时,我遇到了这个问题。问题是我没有在 .cpp 构建工具中考虑name-mangling。尝试在您的本机方法定义周围添加以下内容:

      #ifdef __cplusplus 
      extern "C" {
      #endif
          /* ... */
      #ifdef __cplusplus
      }
      #endif
      

      【讨论】:

        【解决方案4】:

        我也有类似的问题

        虽然上面的帖子很有帮助,但我检查了我的 game.apk,so 库位于 lib/armeabi 下,但是当我在 eclipse 中构建它时,它位于 libs/armeabi 中。

        我认为它通常应该在 libs 下,如果有人可以帮助我在构建时将 lib 更改为 libs 将非常有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-15
          • 1970-01-01
          • 2012-12-08
          • 1970-01-01
          • 2020-06-10
          • 1970-01-01
          相关资源
          最近更新 更多