2017-04-08 5 views
0

Ich schaffe ich NDK OpenGL ES2 Anwendung als inread in einem Tutorial I die gemeinsam benutzte Bibliothek von Java-Seite innerhalb eines statischen Blockes Ladung wie in der Renderer KlasseLast native Bibliothek innerhalb onSurfaceCreated

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

aber dies einen Fehler verursachen call to opengl es api with no current context ich erwartete, dass OpenGL Anrufe von c geschieht, bevor die Oberfläche erstellt und der openGL Kontext gültig, nach einigen Recherchen auf google und versucht, den c-Codes ohne Erfolg ich die Ladefunktion setzte sich ändern innerhalb der onSurfaceCreated dann der Fehler verschwunden. meine Frage ist, dass eine gültige Prozedur speziell, wenn die C++ - Bibliothek in Größe und Klassen erhöht? wenn nein, was ist die richtige lösung?

+1

Es ist seltsam, aber nicht unmöglich. Kann passieren, wenn Ihr C++ - Code OpenGL beim Laden aufruft, z. Verwenden eines Konstruktors einer globalen Variable. –

+0

also ist es normal, die Bibliothek innerhalb onSurfaceCreated Ereignis zu laden oder sollte ich es auf andere Weise beheben? – Mohamed

+0

Wenn Sie keinen Zugriff auf den Quellcode des nativen lib haben und es funktioniert, wenn sie von onSurfaceCreated geladen, und nicht anders, dann lassen Sie es auf diese Weise sein, in der Hoffnung, dass nichts Schlimmeres auf Geräten passieren, dass Sie nicht getestet . –

Antwort

0

die Ladefunktion nicht innerhalb des onSurfaceCreated, der statische Block ist der richtige Weg befinden soll.

Der Fehler ist wahrscheinlich, weil Sie zu schnell Rendering bezogenen Aktionen beginnen - deshalb die Bibliothek Laden zu onSurfaceCreated bewegen ‚gelöst‘ Ihr Problem. Sie müssen über Ihren Code gehen und sicherstellen, dass kein OpenGL-Code ausgeführt wird, bevor die Oberfläche erstellt und das Rendering gestartet wird.

0

Die bewährte Methode besteht darin, die nativen Bibliotheken beim Start der Anwendung zu laden, vorzugsweise in einem Hintergrundthread (daher ist der statische Konstruktor möglicherweise nicht der bevorzugte Ort zum Aufrufen loadLibrary()).

Der native Code kann einige Initialisierung in JNI_OnLoad(), führen aber unterlassen, noch ernsthafte Arbeit beginnen. Sie sollten JNI-Funktionen (Java native Methoden) zur Verfügung stellen, um die eigentliche Arbeit Ihres C++ Codes zu starten. Der Vorteil einer solchen Architektur könnte sein, dass Sie die Flexibilität haben, die Oberfläche oder andere Systemressourcen an den systemeigenen Code zu übergeben.

Betrachten wir auch Verfahren bereitgestellt auszusetzen, starten oder die C++ Verarbeitung zu stoppen. Android OS kann deine App in den Hintergrund schieben und dann wieder im Vordergrund haben; Das System kann die App jederzeit beenden, wenn die Ressourcen knapp werden. In einigen Situationen kann jedoch auch eine Oberfläche zerstört und neu erstellt werden. Ihr C++ Code sollte bereit sein, alle Ereignisse zu überleben.

Verwandte Themen