2017-04-19 31 views
0

我有一個Android應用程序,指定最低API級別15和目標API 17。通常,我指定android-15<ndk>/platforms/android-15)作爲我的API級別(通過--sysroot)爲我的應用程序的本機部分使用Android NDK ,因爲AFAIK的最小值應該通過NDK來定位。在Android NDK中使用比Android Manifest中的最低API更高的API有效嗎?

然而,似乎是在NDK R14鏘+ LLVM STL在那裏同樣strtold符號沒有得到正確定義,除非你的NDK端使用的android-21一個最低的錯誤。

所以我的問題是:使用針對android-21編譯的*.so與針對min SDK 15和17的目標SDK的APK的影響是什麼?我能脫身嗎?

+0

爲什麼不把你的目標API提高到21?你可以保持最小值爲15,而不必擔心有問題。你拼命地試圖避免運行時權限? –

+0

運行時權限踢在API 23 –

+1

「但是,在NDK r14中似乎有一個Clang + LLVM STL的bug,其中符號像'strtold'沒有得到正確的定義,除非你使用最少的'android-21' NDK方面「。這不是一個錯誤。 'android-21'是第一個擁有'strtold'的Android版本。 –

回答

0

簡答:沒有。請參閱我們的Common Problems doc

NDK中的目標API級別與targetSdkVersion在Java中具有完全不同的含義。 NDK目標API級別是您的應用的最低受支持的API級別。在ndk-build中,這是您的APP_PLATFORM設置。

由於對函數的引用(通常)是在加載庫時而不是在第一次調用函數時解析的,因此不能引用並非總是存在的API並通過API級別檢查保護它們的使用。如果他們被提及,他們必須在場。

稍微長一點,更迂腐的答案:只有在特殊情況下,它並不是真的更高。例如,NDK中沒有android-20。在這種情況下,您將回退到android-19,因此可以將NDK目標API設置爲android-20,其中minSdkVersion爲19,因爲無論如何您最終都會使用android-19。

+0

我們似乎不斷碰到對方:-P –

+0

如果我靜態鏈接STL,這真的很重要嗎? –

+0

這不是也沒有。 C庫不是靜態鏈接的。 –

0

如果我記得正確的指定ndk中的最小值,將會包含頭文件和鏈接,以及該版本的android附帶的庫。 理論上講,只要1)這個庫就存在於舊版本中,並且2)這些庫與舊版本ABI兼容。這意味着在類定義或二進制符號的存在,缺失或位置上不會發生重大變化,一般來說linux在保持ABI兼容性方面非常好,但它不是防彈的,而且對於android來說,Google似乎在添加和刪除事物時覺得它幾乎沒有任何理由。當它們在舊版本中破壞或保持ABI兼容性時,它們當然不會做廣告。

我認爲現代版本的android還會在loadlibrary代碼中警告您,如果您嘗試加載鏈接到較新平臺的庫。這看起來不太好。(我一定想到了這一點)

這一切陰謀說你可能不應該這樣做。 就你而言,我可能會建議不要使用LLVM STL(或靜態鏈接它),因爲這是未定義符號的來源,所以LLVM STL在平臺21之前沒有在設備上發貨,所以你不能鏈接它和目標那些設備。

+0

你的第二和第三段簡直是不正確的。 NDK STL根本不在設備上運行,而是在用戶的應用程序中運行。 libC++的確使用了直到android-21(甚至更新)纔可用的東西,但這些定義是由'libandroid_support'爲較老的設備提供的。 –

+0

出於好奇,如果每個應用都捆綁自己的副本,動態鏈接運行時會有什麼意義?我認爲他們仍然可以在內存中進行重複數據刪除?例如,微軟不喜歡你將運行時與你的應用捆綁在一起。相反,他們更喜歡捆綁安裝程序,以允許它們修復運行時等。 –

+0

如果您的應用程序中有多個共享庫,則需要使用共享STL而不是靜態的。如果你只有一個共享庫,你最好用靜態庫。 –

相關問題