2017-12-14 8 views
1

私はAndroidプログラミングの最初の部分を始め、CとC++で書かれたライブラリをAndroidに移植しています。私はライブラリをテストする以外は、アプリケーションを構築していません。製品はライブラリであり、私の顧客に提供されます。ライブラリは数学的モデリングであり、デバイス上で動作し、Webまたはクラウドインタフェースはありません。クラウドでそれらを実行したい顧客は、LinuxまたはWindowsビルドを使用してこれを実行しています。異なるNDKでコンパイルされたC/C++コードのフォワード/後方互換性?

私の最初の顧客はNDK 14bを使用しています。私はそれを使うことができました、または私は最新のNDK、16bを使うことができました。互換性のある命令セットと私の顧客と同じC++ランタイムとターゲットAPIバージョンを持つNDK 16bでCコードをコンパイルすると、NDK 14bアプリケーションで構築した静的ライブラリを使用できるようになりますか?

NDK 14bを使用していて、別の顧客がNDK 16bを使用している場合、14bで構築した静的ライブラリは、16bで構築されたアプリケーションで動作しますか?私はそれらに同じまたはより早いAPI、同じ命令セットとC + +のランタイムを対象にしています。

+0

下位互換性の一般的な問題を扱う_ [こちらの説明](https://softwareengineering.stackexchange.com/questions/329948/handle-backward-compatibility-on-api-changes)_ – ryyker

+0

ありがとうしかし、それは関連していないようです。私が見る限り、Web APIについて話していますが、Android OS APIを呼び出すC/C++コードについて話しています。 –

答えて

2

異なるNDKリリースを使用する場合、kindofは同じC++ランタイムをターゲットにすることはできません。 STLのバージョンはあまり変わらないが、安定性の契約はない。

NDK r16の静的ライブラリは、r14との逆の場合は正しくと正しく連携しますが、ギャップが大きければ大きいほど、処理する必要があるグリッチが増えます。

一般に、NDKの改善にはバグ修正が含まれているため、最新のリリースを使用するインセンティブがあります。しかし、大きな進歩は新しいプラットフォームのバージョンのサポートで行われます。つまり、ライブラリがLollipopをターゲットとするアプリにリンクされている場合、r16の利点はあまり目立たなくなります。あなたがリンクされ、共有ライブラリ(そう)として、あなたのライブラリーを出荷することができた場合、ホストアプリで、あなたの相互依存性が大幅に少なくなり、私の経験では、これは、安定性を向上させ、衝突を減少させること

注意。関連性がある場合は、この方法もより安全です。

+1

私は、あなたのNDK APIレベル(あなたのビルドシステムに応じて、 'APP_PLATFORM'、' ANDROID_PLATFORM'、または 'minSdkVersion')が持っている効果を意識する必要があるということを追加します。これは、コードが動作する*最小* APIレベルです(小さなコーナーケースがいくつかあります)。 21をターゲットにしている場合、クライアントのアプリケーションは、ライブラリを使用している場合は、Lより前のLで動作しません。 –

+2

ああ、アレックスは何かを暗示したが、直接は言及しなかった:あなたがSTLを使用する場合、あなたのクライアントは同じSTLを使用しなければならない。 –

+0

私は少しSTLの問題について混乱しています。私はmacOS上で慣れ親しんでいるlibC++を使うことを期待しています。そのOS上で、Appleの-mmacosx-version-minコンパイラオプションを正しく使用すると、libC++は完全に後方互換性があるようです。私はAndroid APIバージョンが類似していると思っていたと思います。 API 21(「Lollipop」)に設定した場合、私のコードは古いものではなくなりますが、それは問題ではないことを理解しています。このコードは、かなり特殊なアプリケーション向けです。 –

関連する問題