使用CrystaX和Qt构建android应用程序:java.lang.UnsatisfiedLinkError

时间:2015-12-04 07:19:46

标签: android qt android-ndk qt5

我正在尝试使用Qt application为Android构建Qt Creator。我使用CrystaX NDK代替goolge'因为我需要在我的项目中使用boost libraries,而且,正如CrystaX的官方网站所说,它随之而来。

我使用的是以下版本的工具:

  • Qt Creator 3.4.2
  • Qt 5.5.0
  • CrystaX NDK 10.2.1

首先,我必须在.pro文件中手动添加库和标题路径,因为它没有自动找到。存在编译器错误:can't locate libcrystax,源文件中存在一些关于包含boost headers的错误。我在项目文件中添加了以下行:

android {
    INCLUDEPATH +=  $$NDK_ROOT/sources/crystax/include \
                    $$NDK_ROOT/sources/boost/1.58.0/include \
                    $$PWD/ssl
    LIBS += -L"$$PWD/ssl" -lssl -lcrypto
    LIBS += -L"$$NDK_ROOT/sources/crystax/libs/$$ANDROID_TARGET_ARCH"
    ANDROID_EXTRA_LIBS = $$NDK_ROOT/sources/crystax/libs/$$ANDROID_TARGET_ARCH/libcrystax.so
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
}

重新重建后,我收到了runtime error或类似内容的错误(libgnustl_shared requires libcrystax, but libcrystax is not loaded)。

在搜索互联网之后,我发现它正在发生,因为一个需要另一个库的库正在它之前加载,而第二个库在应用程序目录中没有被搜索,仅在系统路径。

我找到了一种解决方法 - 手动加载所需的库。我将默认QtActivity.java复制到我的项目目录(android/src/.../QtActivity.java)中以替换默认值并添加以下代码:

static {
    System.loadLibrary( "crystax" );
}

之后我没有收到这个错误,但现在我又被另一个错误了:

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 37 cannot locate '__aeabi_ldiv0'...

是否可以使用Qt + CrystaX NDK构建Android应用程序?我做错了吗?如果我弄错了或者我误解了整个概念,请解释如何正确地做到这一点。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

这是因为您没有与libgcc.a相关联。我不知道你的构建系统究竟是如何工作的(好吧,Qt的一个),但一般来说,将libgcc.a添加到其他库列表应该会有所帮助:

ANDROID_EXTRA_LIBS = $$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9/libgcc.a

此行指定arm的{​​{1}}变体;显然,你应该根据libgcc.a值使用正确的值。