イントロ:Java(JNI)ラッパーを備えたネイティブライブラリ(C ++)があります。ライブラリエンジンはCPUを集中的に使用します。このライブラリをリンクする複数のアプリを同時に実行する必要はありません。また、複雑なオブジェクトはライブラリエンジンによって返される必要があります。
質問:そのようなAndroidライブラリを設計するための最良の方法は何ですか?
これまでのところ、 OpenCVマネージャーとConnectbotssh-agentの2つの貴重な例を見つけることができました。
私はいくつかの解決策を考えることができます:
解決策1:ライブラリ機能をラップする(バインドまたはAIDL)サービスを作成します。(サービスは独自のスペースで実行する必要がありますか?またはサービスにリンクするアプリケーションのスペースで実行する必要がありますか?別のアプリスペースにある場合、ネイティブライブラリをロードするにはどうすればよいですか(
System.load("/data/data/com.company.myLib/lib.so")
)。AIDLで複雑なオブジェクトを返す方法は?)これはConnectbotの方法である必要があります。解決策2:ライブラリを2つのコンポーネントに分割します。
- ネイティブライブラリとマネージャーサービスを保持するスタンドアロンパッケージ
- ユーザーがアプリのビルドに使用できるJavaラッパーのみを含むAndroidlibプロジェクト。
これはOpenCVマネージャーの方法である必要があります。詳細はわかりませんが、この方法では、インターフェースをとるサービスは必要なく、ただできます
import com.company.myLib.LibWrapper
。反対側では、LibWrapperクラスが実行する必要がありますSystem.load("/data/data/com.company.myLib/lib.so")
。正しい?
私は個人的に解決策2に行きます。残念ながら、Androidは新しい土地であり、ライブラリの開発方法に関するモデルはまだ多くありません。他の/より良い解決策はありますか?他に考慮すべき点はありますか?