我想建立Qt application
爲Android使用Qt Creator
。我使用CrystaX NDK
代替了goolge的android版本,因爲我需要在我的項目中使用boost libraries
,而且正如CrystaX的官方網站所說,它隨附了它。使用CrystaX使用Qt構建Android應用程序:java.lang.UnsatisfiedLinkError中
我使用下面的工具版本:
- 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
}
再次重建後,我已經得到了,說libgnustl_shared requires libcrystax, but libcrystax is not loaded
或類似的錯誤(runtime error
)。
搜索互聯網後,我發現,它的發生,因爲一個圖書館,需要另一種,是之前加載,而第二個庫,不被搜索,在應用程序目錄,只有在系統的路徑。
我找到了一個解決方法 - 手動加載所需的庫。我複製默認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應用程序?我做錯了嗎?請解釋如何正確地做,如果我弄錯了,或者我誤解了整個概念。任何幫助表示讚賞。
謝謝你的回答! 你可以看看nmg輸出爲libgcc.a文件嗎?沒關係,它有兩個未定義的符號和一個弱名稱('__aeabi_ldiv0')? '納米$$ NDK_ROOT /工具鏈/臂-Linux的androideabi-4.9 /預建/ Linux的x86_64的/ LIB/GCC /臂-Linux的androideabi/4.9 /的ARMv7-A/libgcc.a的| grep的ldiv0': 'ü__aeabi_ldiv0','ü__aeabi_ldiv0','00000000W¯¯__aeabi_ldiv0' –
是的,它的確定。這是如何構建'libgcc.a' - 它是從一堆目標文件(。o),其中兩個需要'__aeabi_ldiv0'(因此它在nm輸出中顯示爲'U__aeabi_ldiv0'),另一個定義它(因此在nm輸出中顯示爲'W__abab_ldiv0')。它將'__aeabi_ldiv0'定義爲弱符號的原因是爲了讓開發人員在需要時替換它 - 例如,提供替代的,更優化的版本。但是,如果開發人員不想用自己的版本替換它,它就會正常工作。 –
謝謝!我發現'libgnustl_shared'需要'libcrystax'來加載,而'libQt5Core'需要'libgnustl_shared'來加載。使用Google NDK構建的'libQt5Core.so'並由Qt 5框架提供。我正在嘗試使用'CrystaX NDK'來構建android包。所以這個軟件包是由來自'Crystax NDK'和'libQt5Core'的'libgnustl_shared'完成的,它需要'Google NDK'中的'libgnustl_shared'。這可能是這個錯誤的原因嗎?我已經手動鏈接了'libgcc.a',但是看起來它太過分了,因爲它已經被構建工具鏈接了。 –