簡體   English   中英

由於嘗試在Android上啟動本機gles2 / egl應用程序而沒有本機活動,導致分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM