【发布时间】:2015-03-23 10:52:52
【问题描述】:
您好,我正在尝试将 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
我什至可以在项目构建目录中看到 libassimp.so(不是 libassimp.so.3)文件 ../android-build/libs/armeabi-v7a.
不知道从哪里开始,手动将 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".
我什至在我的 android 的 assimp 构建目录上运行 cmake 后编辑了 link.txt 文件,用 -soname,libassimp.so 更改条目 -soname,libassimp.so.3 但它仍然创建 libassimp.so.3.1。 1 及其两个链接,即 libassimp.so.3 和 libassimp.so。所以还是卡住了..
【问题讨论】:
-
应用程序在
lib3dqtquick.so文件上调用dlopen()的位置,您可以在其上方添加另一个dlopen()并带有依赖项的完整路径吗?我只是在猜测,但也许链接器在不同的路径中寻找.so,这就是它找不到它的原因。 -
您必须手动复制库对我来说听起来很奇怪。您是否在
.pro文件中设置了ANDROID_EXTRA_LIBS? -
我同时使用了ANDROID_EXTRA_LIBS和手动,因为前者似乎没有添加后缀为.so.3的文件
-
嗯,很奇怪。我一直部署在 Qt Creator 中创建的库,所以我无法判断直接使用 ndk 创建的库。深入研究会很有趣。
标签: android qt android-ndk cmake assimp