4

您好我正在尝试将 OpenGL 桌面应用程序移植到 android。我对 android 开发一无所知,所以我依赖 Qt Creator 来打包应用程序。作为设置的一部分,我在 android ndk 中使用以下设置调用了“make-standalone-toolchain”脚本

--platform=android-21 
--toolchain=arm-linux-androideabi-4.9 
--system=linux-x86_64

然后我使用 android-cmake 并将我新创建的独立工具链的路径传递给它,它在我的 assimp 目录树中创建了 libassimp.so、libassimp.so.3 和 libassimp.so.3.1.1(ln)。

我将 libassimp.so 路径传递给“附加库”下的 Qt 创建者项目构建菜单。但是,在 android 上部署应用程序时,它会崩溃并出现错误:

 dlopen("/data/app/org.qtproject.example.a3dqtquick-2/lib/arm/lib3dqtquick.so", RTLD_LAZY) failed: dlopen failed: could not load library "libassimp.so.3" needed by "lib3dqtquick.so"; caused by library "libassimp.so.3" not found

我什至可以在 ../android-build/libs/armeabi-v7a 的项目构建目录中看到 libassimp.so(不是 libassimp.so.3)文件。

不知道从哪里开始,手动将 libassimp.so.3 放在这个位置并不能解决问题。谢谢阅读。我将在您的反馈中添加更多信息。请原谅任何信息不足,因为这是我第一次使用 android 进行实验。

以下是 deployment-settings.json 文件

  "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
   "qt": "/home/ubashir/programs/Qt/5.4/android_armv7",
   "sdk": "/home/ubashir/programs/android-sdk-linux",
   "sdkBuildToolsRevision": "21.1.2",
   "ndk": "/home/ubashir/programs/android-ndk-r10d",
   "toolchain-prefix": "arm-linux-androideabi",
   "tool-prefix": "arm-linux-androideabi",
   "toolchain-version": "4.9",
   "ndk-host": "linux-x86_64",
   "target-architecture": "armeabi-v7a",
   "qml-root-path": "/home/ubashir/code/3dqtquick",
   "application-binary": "/home/ubashir/code/3dqtquickAndroid/lib3dqtquick.so" 

更新:

我现在已经尝试过这个.. 用后者的副本替换所有指向 assimp.so.3.1.1 的链接,所以现在我的库 libassimp.so.3 是一个文件,而不是指向 libassimp.so.3.1.1 的链接。我手动将 libassimp.so.3 添加到我的项目子文件夹 android/libs/aremabi-v71 --- 不好。我确认我的构建目录显示了所有 libassimp 文件,因为我手动添加了它们,因此推测它们正在被部署,但错误仍然存​​在:

failed: dlopen failed: could not load library "libassimp.so.3" needed by "lib3dqtquick.so".

如此处所述http://webmail.dev411.com/p/gg/android-ndk/1386vger6e/use-assimp-c-library-in-ndk-ld-error-obj-local-armeabi-v7a-libassimp-so -与 vuforia 不兼容的使用目标

我什至在我的 android 的 assimp 构建目录上运行 cmake 后编辑了 link.txt 文件,用 -soname,libassimp.so 更改条目 -soname,libassimp.so.3 但它仍然使用它的创建 libassimp.so.3.1.1两个链接,即 libassimp.so.3 和 libassimp.so。所以还是卡住了。。

4

2 回答 2

0

我使用 CMake for 和 Android 项目构建的共享库遇到了同样的问题。我找到了修复它的方法。如果您更熟悉 CMake,可能会有更简洁的解决方案。

在 CMakeLists.txt 文件中搜索“SOVERSION”和“SET_TARGET_PROPERTIES()”

在 SET_TARGET_PROPERTIES() 例程中注释掉 VERSION 和 SOVERSION 的行,如下所示

SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES                # create *nix style library versions + symbolic links
    DEFINE_SYMBOL DSO_EXPORTS
        #   VERSION ${PROJECT_VERSION}
        #   SOVERSION ${PROJECT_SOVERSION}
    CLEAN_DIRECT_OUTPUT 1                   # allow creating static and shared libs without conflicts
    OUTPUT_NAME "${PROJECT_NAME}${PROJECT_DLLVERSION}"  # avoid conflicts between library and binary target names
)

然后在 CMake 中重新运行配置和生成步骤并重建目标。这应该给你一个 .so 没有任何版本号。

于 2015-04-09T19:21:14.680 回答
-1

我建议您看一下我发现的问题的解决方案(与您的问题非常相似):

libgdal.so android 错误:无法加载库“libgdal.so.1”

希望这可以帮助。

于 2015-01-26T13:32:33.853 回答