Android プラットフォームに移植するネイティブ C++ プロジェクトは、いくつかの静的および動的ライブラリに基づいており、これらのモジュール間で共有される c++11 ベースのスレッド セーフ シングルトンを使用しています。
これが私の実際の構造の例です:
brCore (Core elements, Manager (Singletons), Logger (Singleton) ect.) STATIC
brGrapics (Generic graphics) uses brCore STATIC
brOpenGLES (GLES renderer) uses brCore, brGraphics DYNAMIC
私の Android アプリケーション (これも DYNAMIC) は、これら 3 つのライブラリを使用し、起動時に brOpenGLES を動的にロードします。Linux および Windows プラットフォームでは何も問題なく動作しますが、Android ではシングルトンで問題が発生しました。
04-08 06:47:24.601: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.611: I/NativeActivitySimpleExample(1059): Singleton constructor invoked : brFileHandler
04-08 06:47:24.611: I/NativeActivitySimpleExample(1059): brFileHandler set internal data path: /data/data/com.binrev/files
04-08 06:47:24.611: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.031: I/NativeActivitySimpleExample(1059): Try to initialize Render API
04-08 06:47:24.031: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.051: I/NativeActivitySimpleExample(1059): Singleton constructor invoked : brRessourceManager
04-08 06:47:24.051: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.251: I/NativeActivitySimpleExample(1059): Try to init Logger: brCore
04-08 06:47:24.251: I/NativeActivitySimpleExample(1059): Search for existing logger
04-08 06:47:24.282: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.282: I/NativeActivitySimpleExample(1059): Singleton constructor invoked : brRessourceManager
04-08 06:47:24.282: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.282: I/NativeActivitySimpleExample(1059): Singleton constructor invoked : brConfigManager
04-08 06:47:24.601: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
04-08 06:47:24.611: I/NativeActivitySimpleExample(1059): Singleton constructor invoked : brFileHandler
04-08 06:47:24.611: I/NativeActivitySimpleExample(1059): brSingleton getInstance called
ご覧のとおり、スレッド セーフなシングルトンのコンストラクターが複数回呼び出されています。シングルトン (brFileHandler 内部データ パス) で設定された値は、後で失われます。ライブラリにはシングルトンの個別のインスタンスがあり、ライブラリの境界間でコンテンツを共有できなかったようです...
どうすればこの問題を解決できますか? 助けてくれてありがとう。