2017-04-08 40 views
0

創建我NDK的OpenGL ES2應用程序作爲inread在一個教程我加載從Java端共享庫的靜態塊內像在渲染器類負載本地庫內部onSurfaceCreated

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

但這導致錯誤call to opengl es api with no current context我預料到,從c開始的OpenGL調用發生在創建表面之前,並且openGL上下文變得有效之後,在對google進行了一些研究並試圖無法成功更改c代碼之後,我將加載函數放入onSurfaceCreated之內,然後錯誤消失。 我的問題是,如果C++庫增加了大小和類,特別是一個有效的過程?如果沒有什麼是正確的解決方案?

+1

這很奇怪,但並非不可能。如果您的C++代碼在加載時開始調用OpenGL,可能會發生,例如使用一些全局變量的構造函數。 –

+0

那麼它是經常加載庫內onSurfaceCreated事件或我應該以另一種方式解決它? – Mohamed

+0

如果您無法訪問本機庫的源代碼,並且它在從onSurfaceCreated加載時工作,並且在其他情況下失敗,那就讓它這樣,希望沒有更糟糕的事情發生在您未測試的設備上。 –

回答

0

加載函數不應該駐留在onSurfaceCreated中,靜態塊是正確的方法。

錯誤可能是因爲您正在儘快開始渲染相關操作 - 這就是爲什麼將庫加載到onSurfaceCreated'解決'您的問題。您需要檢查代碼並確保在創建表面並開始渲染之前,不會執行與opengl相關的代碼。

0

好的做法是在app start上加載本地庫,最好是在後臺線程上(因此靜態構造函數可能不是調用loadLibrary()的首選地方)。

本地代碼可能在JNI_OnLoad()中執行一些初始化,但是不要開始認真的工作。您應該提供JNI函數(Java 本地方法)以開始C++代碼的實際工作。這種體系結構的好處在於,您可以靈活地將曲面或其他系統資源傳遞給本機代碼。

請考慮提供掛起,重新啓動或停止C++處理的方法。 Android操作系統可以將您的應用程序推送到後臺,然後再次將其置於前臺;如果系統運行資源不足,系統可以隨時銷燬應用程序,但在某些情況下,表面可能會被銷燬並重新創建。你的C++代碼應該能夠在所有事件中倖存下來。