2017-04-08 1 views
0

内部のネイティブライブラリ私はチュートリアルでinreadとしてI NDKのOpenGL ES2アプリケーションを作成し、私はレンダラクラスのような静的ブロック内のJava側から共有ライブラリをロードロードonSurfaceCreated

static { 
    System.loadLibrary("game"); 
} 

が、これは誤りcall to opengl es api with no current contextを引き起こします私は、OpenGLの呼び出しは、表面が作成され、OpenGLのコンテキストが有効になる前に、Googleでいくつかの研究を行って、成功しなかったCコードを変更しようとすると、onSurfaceCreatedのエラーが消えてから有効になることを期待しています。 私の質問は、特にC++ライブラリのサイズとクラスが増えた場合に有効な手続きですか?正しい解決策が何もない場合は?

+1

これは奇妙ですが不可能ではありません。あなたのC++コードがロード時にOpenGLを呼び出し始めると起こります。いくつかのグローバル変数のコンストラクタを使用します。 –

+0

ライブラリをonSurfaceCreatedイベント内にロードするのは定期的ですか、別の方法で修正する必要がありますか? – Mohamed

+0

ネイティブlibのソースコードにアクセスできない場合に、onSurfaceCreatedからロードされたときに動作し、それ以外の場合は失敗した場合は、テストしなかったデバイスで悪化することはない。 –

答えて

0

ロード機能はonSurfaceCreated内に存在してはいけません。スタティックブロックは正しい方法です。

エラーはおそらく、レンダリング関連のアクションをあまりにも早く開始しているためです。これは、ライブラリの読み込みをonSurfaceCreatedに移して問題を解決した理由です。あなたはあなたのコードを調べ、表面が作成されてレンダリングが始まる前にOpenGL関連のコードが実行されないようにする必要があります。

0

アプリ起動時に、好ましくはバックグラウンドスレッドでネイティブライブラリを読み込むことをお勧めします(したがって、静的コンストラクタはloadLibrary()を呼び出すのに好ましい場所ではありません)。

ネイティブコードはJNI_OnLoad()で初期化を実行することがありますが、まだ深刻な作業を開始することはできません。 C++コードの実際の作業を開始するには、JNI関数(Java ネイティブメソッド)を提供する必要があります。このようなアーキテクチャのメリットは、サーフェスや他のシステムリソースをネイティブコードに渡す柔軟性が最も高いことです。

C++処理を一時停止、再起動、または停止する方法も検討してください。 Android OSはあなたのアプリをバックグラウンドにプッシュして、フォアグラウンドに再び置くことができます。リソースが少なくなってもシステムはいつでも終了することができますが、状況によってはサーフェスを破棄して再作成することもできます。あなたのC++コードは、すべてのイベントで生き残る準備ができているはずです。