2017-04-19 2 views
0

私は、AndroidのNDKを使用しているアプリケーションのネイティブ部分については、通常、APIレベルとして15,15のターゲットAPIを指定するAndroidアプリを持っています(--sysrootを介して)android-15<ndk>/platforms/android-15) AFAIKはNDKを介して最小限の目標を設定する必要があるためです。Android NDKの上位APIをAndroid Manifestの最小APIよりも使用することは有効ですか?

しかし、あなたはNDK側android-21最小を使用しない限りstrtoldのような記号が正しく定義されませんNDKのR14でクラン+ LLVMのSTLとバグがあるようです。

*.soandroid-21にコンパイルし、最小SDKを15、ターゲットSDKを17に設定したAPKを使用した場合の影響を教えてください。私はこれで逃げることができますか?

+0

なぜ21にターゲットAPIを上げませんか?最小値を15に保つことができ、問題があることを心配する必要はありません。あなたは必死に実行時のアクセス許可を避けようとしていますか? –

+0

API 23の実行時のアクセス許可 –

+1

"NDK r14のClang + LLVM STLには、' strtold 'のようなシンボルが正しく定義されていないバグがあるようです。 NDK側。これはバグではありません。 'android-21'は' strtold'を持つAndroidの最初のバージョンでした。 –

答えて

0

短い答え:いいえ。 Common Problems docをご覧ください。

NDKのターゲットAPIレベルは、JavaではtargetSdkVersionとは非常に異なる意味を持ちます。 NDKターゲットAPIレベルは、アプリの最小のAPIレベルです。 ndk-buildでは、これはあなたのAPP_PLATFORMの設定です。

ライブラリがロードされるのではなく、彼らが最初に呼び出されたとき、あなたは常に存在していないAPIを参照し、APIレベルチェックでの使用を守ることができないとき、関数への参照は、(一般的に)解決されているので。それらがまったく参照されていれば、存在しなければならない。

多少長く、より賢明な答え:それほど高くない特別な場合にのみ。たとえば、NDKにはアンドロイド20はありません。この場合は、あなたが戻っアンドロイド-19に落ちるので、あなたが実際にとにかくアンドロイド-19を使用してしまいますので、それは19のminSdkVersionとアンドロイド-20にNDK目標APIを設定しても大丈夫です。

+0

私たちはお互いにぶつかり合っているようです:-P –

+0

私はSTLを静的にリンクしている場合、これは本当に重要ですか? –

+0

それはここにもそこにはありません。 Cライブラリは静的にリンクされていません。 –

0

私は右のNDKで最小を指定して覚えている場合は、アンドロイドのリリースに付属のライブラリに対するヘッダとリンクが含まれます。 これは、理論的には、1)と同じくらい良いでしょう。ライブラリは古いバージョンにあり、2)ライブラリはABIと旧バージョンとの互換性があります。つまり、クラス定義やバイナリ内のシンボルの存在、不在、場所の変更はありませんが、一般的にlinuxはABI互換性を維持するのにはかなり良いですが、それは防弾ではなく、アンドロイドではなく、事実上何の理由もありません。古いバージョンではABIとの互換性を破ったり、保存したりしたときに広告を出しません。

私は、あなたがしようとする新しいプラットフォームに対してリンク負荷ライブラリ場合アンドロイドの最近のバージョンでもLoadLibraryのコードで警告を表示すると思います。どちらが良い見えない。(私はこれを想像したんだろう)

このすべては、あなたはおそらくそれを行うべきではないと言って共謀します。 あなたのケースでは、私はおそらく、LLVMのSTLを使用しないことをお勧めします(または静的にリンクする)だろう、それは未定義のシンボルの源であることから、LLVMのSTLは、プラットフォーム21の前にデバイス上で出荷していなかったので、あなたはそれとターゲットにリンクすることはできませんそれらのデバイス。

+0

2番目と3番目の段落は単に正しくありません。 NDK STLは、デバイスにはまったく出荷されず、ユーザーのアプリで出荷されます。 libC++はandroid-21(またはもっと新しいもの)まで利用できないものを使用しますが、それらの定義は古いデバイスの 'libandroid_support 'によって提供されます。 –

+0

好奇心から、各アプリケーションが自分のコピーをバンドルしている場合、ランタイムを動的にリンクする際のポイントは何ですか?私は彼らがまだメモリ内で重複排除されていると考えていますか? たとえば、あなたのアプリケーションでランタイムをバンドルすることが好きではありません。代わりに、あなたはインストーラをバンドルして、それらをホットランタイムなどにすることができます。 –

+0

あなたのアプリに複数の共有ライブラリがある場合は、静的ライブラリではなく共有STLを使用する必要があります。共有ライブラリが1つしかない場合は、静的なライブラリを使用する方が良いでしょう。 –

関連する問題