0

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 内部データ パス) で設定された値は、後で失われます。ライブラリにはシングルトンの個別のインスタンスがあり、ライブラリの境界間でコンテンツを共有できなかったようです...

どうすればこの問題を解決できますか? 助けてくれてありがとう。

4

1 に答える 1

0

問題は解決しました。モジュールの動的ライブラリ インスタンスを使用する必要があります。

于 2013-04-30T09:35:10.257 に答える