![](/img/trans.png)
[英]Nothing is drawn when using gles 2.0\egl\native activity on Android
[英]Segmentation fault due to attempt to launch native gles2/egl app on android, without native activity
對不起,我的英語不是我的母語。
我正在嘗試在沒有native_activity的Android(Galaxy S4,Jelly Bean)上啟動簡單的gles2 / egl應用程序。
我有下一個main.c:
#include <stdio.h>
#include <stdlib.h>
#include <EGL/egl.h>
#include <GLES2/gl2.h>
int main( void )
{
EGLDisplay dpy;
printf( "hello world.\n" );
dpy = eglGetDisplay( EGL_DEFAULT_DISPLAY );
printf( "egl dpy: %p.\n", dpy );
return 0;
}
接下來的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world_gr
LOCAL_SRC_FILES := main.c
# I have found libGLESv2.so and libEGL.so libraries and appropriate header files in ndk.
LOCAL_LDLIBS := -L/home/ila/programs/android-ndk-r10e/platforms/android-18/arch-arm/usr/lib -lGLESv2 -lEGL
LOCAL_C_INCLUDES := /home/ila/programs/android-ndk-r10e/platforms/android-18/arch-arm/usr/include
include $(BUILD_EXECUTABLE)
由於我有4.3(Jelly Bean)android版本,因此選擇了第18個NDK支持的API級別。
我的項目的目錄如下(在構建之前):
prj:
-- jni:
-- main.c
-- Android.mk
因此,我啟動ndk-build(在prj目錄中)並在prj / libs / armeabi和prj / obj / local / armeabi /中獲得名稱為hello_world_gr的ARM ELF可執行文件。
我也試圖從電話中提取libEGL.so和libGLESv2.so庫,並使用它們進行鏈接。
在這兩種情況下,應用程序都成功在電話上啟動,沒有任何鏈接器錯誤,應用程序打出了問候世界,並在eglGetDisplay中出現了一段延遲(其中什么也沒有發生)的分段錯誤。
如果我嘗試在桌面Ubuntu上執行此操作:
$ gcc -o hello_world_gr main.c -lGLESv2 -lEGL
$ ./hello_world_gr
hello world.
egl dpy: 0x25e7010.
如您所見,一切都很好。
在基於X11的目標上,我可以通過例如xcb_connect()獲得EGLNativeDisplay,並將其傳遞給eglGetDisplay,這樣的功能對於android是否存在(當然,我的意思是關於C / C ++函數)?
您可以查看https://android.googlesource.com/platform/hardware/libhardware/+/master/tests/hwc/並確保它不是我的瘋狂主意。
我已經構建並啟動了此示例,但是再次在eglGetDisplay中收到了此類分段錯誤。 (我也通過ndk手動構建了此應用,沒有完整的Android構建。)
有人嘗試這樣做嗎? 你成功了嗎?
我不確定您的代碼段為何崩潰 ,但我不希望它起作用。 當然,在其余的Android框架運行時不會。
盡管我們喜歡將計算機和設備視為具有“幀緩沖區”,但實際上,這種事情可能無法訪問或根本不存在-可能由一組可配置的覆蓋物替代。 在Android上,幀緩沖和覆蓋由硬件編輯器(HWC)最低級別管理,而系統圖形合成器(SurfaceFlinger)則稍高級別。
查找非應用程序示例的最佳位置是frameworks/native/opengl/tests
目錄。 如果系統合成器正在運行,則可以要求它在其上繪制表面。 “天使”演示提供了一個很好的例子。 它使用WindowSurface類(在lib
目錄中)從SurfaceFlinger獲取頂級顯示大小的表面。 即使在應用程序運行時,它也可以工作。
如果SurfaceFlinger不可用,則需要直接與硬件編輯器進行交互。 hwc
目錄中的測試可以做到這一點。 請注意,如果SurfaceFlinger正在運行,則它們將不起作用。 (它們已經足夠老了,可能根本無法工作了。)
這些都不使用公共SDK API,因此,如果在舊版本或更新版本的Android上運行,您的代碼很可能會損壞。
有關Android圖形體系結構的更多信息,尤其是SurfaceFlinger和HWC,可以在這里找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.