2015-12-04 75 views
1

我想建立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應用程序?我做錯了嗎?請解釋如何正確地做,如果我弄錯了,或者我誤解了整個概念。任何幫助表示讚賞。

回答

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變種libgcc.a;顯然,你應該使用適當的一個取決於ANDROID_TARGET_ARCH值。

+0

謝謝你的回答! 你可以看看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' –

+0

是的,它的確定。這是如何構建'libgcc.a' - 它是從一堆目標文件(。o),其中兩個需要'__aeabi_ldiv0'(因此它在nm輸出中顯示爲'U__aeabi_ldiv0'),另一個定義它(因此在nm輸出中顯示爲'W__abab_ldiv0')。它將'__aeabi_ldiv0'定義爲弱符號的原因是爲了讓開發人員在需要時替換它 - 例如,提供替代的,更優化的版本。但是,如果開發人員不想用自己的版本替換它,它就會正常工作。 –

+0

謝謝!我發現'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',但是看起來它太過分了,因爲它已經被構建工具鏈接了。 –

相關問題