SDL2 Android vulkan question

Danny Arends Danny.Arends at gmail.com
Sun May 2 08:58:30 UTC 2021


Dear all,

I've written a 2D/3D engine in D before which runs on windows, 
linux and android using SDL2 as the window manager and uses 
Modern OpenGL /OpenGLES for rendering. It compiles fine for 
android using ldc and works like a charm, although the garbage 
collection under android has multi-threading issues.

Since OpenGL is abandoned, I am currently adding Vulkan support 
to future proof it.

I have done this in D with the help of the bindbc-sdl and erupted 
packages and managed to get the whole vulkan-tutorial.com example 
working under windows without much hassle. (I bet it would run on 
linux without much issues as well)

So I have now been stuck for a week on getting the tutorial 
example to successfully run on android. To do this I get a DLL 
compiled with ldc, I have setup the SDL2 toolchain for android, 
with symlinks to SDL2/IMAGE/TTF/etc, I hook the call to SDL_main 
from the JNI:

```D
/* Main entry point to the program */
version (Android) {
   import core.memory;
   import core.runtime : rt_init;

   extern(C) int SDL_main(int argc, char* argv) { // Hijack the 
SDL main
     rt_init();
     GC.disable(); // The GC crashes on android
     run(["android"]);
     return(0);
   }
// Other OS can just call run() directly (No known issues with 
garbage collection)
} else { void main (string[] args) { run(args); } }
```

I create my APK using Android Studio, and load it onto my phone. 
The hook succeeds, I can do:

```D
loadSDL();
SDL_Log("SDL loaded");
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
SDL_Log("SDL init");
SDL_Vulkan_LoadLibrary();
SDL_Log("SDL_Vulkan_LoadLibrary");
```

I see SDL being loaded and initialized (successfully) on my 
phone. However, the SDL_Vulkan_LoadLibrary call just crashes the 
whole thing dead, with a:

```cmd
I/SDL/APP: SDL loaded
I/SDL/APP: SDL init
A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault 
addr 0x0 in tid 25878 (SDLThread), pid 25794 (SDLActivity)
```

I was wondering if I am missing something obvious. Since it works 
for SDL2 and opengles

Any thoughts on why loading the Vulkan library using SDL2 would 
not work ?
thoughts in general about the process ?

Danny





More information about the Digitalmars-d-learn mailing list