如何将 SDL2 与 .NET MAUI 结合使用

问题描述 投票:0回答:1

我正在尝试将 SDL2 与 .NET MAUI 一起使用。

我尝试使用 buildscripts 目录中的 androidbuildlibs.sh 构建本机库。它为不同的体系结构生成了 libSDL.so。然后我将它们添加到项目中的 libs/ 目录中,并将构建操作设置为 AndroidNativeLibrary。当我尝试使用以下方法初始化 SDL 时:

[DllImport("libSDL2.so", CallingConvention = CallingConvention.Cdecl)]
public static extern int SDL_Init(uint flags);

SDL_Init 方法返回 -1。

我想我应该在 MainActivity 的某个地方初始化它。因此,我构建了包含 SDLActivity 的 java 库到 .jar 文件,并为其创建了一个绑定项目。然后我尝试让 MainActivity 继承自 SDLActivity 而不是 MauiAppCompatActivity。我重写了 LoadLibraries 方法,如下所示:

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : SDLActivity
{
    public override void LoadLibraries()
    {
        base.LoadLibraries();
        SDL2Helper.InitSDL();
    }
}

现在我收到一个错误,表明未找到 libmain.so。

android shared-libraries maui sdl entry-point
1个回答
0
投票

我还尝试让 SDL2 与 Xamarin 和 MAUI 一起使用。

我还使用 .jar 文件创建了一个绑定项目,并将库添加到 lib 文件夹中。

我不想直接从 SDLActivity 继承,所以我尝试手动初始化 SDL。

此代码基于 Qt 问题和 libsdl 存储库中的 android-project 源代码:

https://github.com/libsdl-org/SDL/issues/5356

https://github.com/libsdl-org/SDL/tree/SDL2/android-project

以下是我如何让 SDL 在 MAUI 上工作的示例:

 public class MainActivity : MauiAppCompatActivity
 {
     protected override void OnCreate(Bundle? savedInstanceState)
     {
         base.OnCreate(savedInstanceState);
         InitSdl();
     }

     protected override void OnDestroy()
     {
         base.OnDestroy();
         CloseSdl();
     }

     private void InitSdl()
     {
         SDL.LoadLibrary("SDL2", this);
         SDL.SetupJNI();
         SDL.Initialize();
         SDL.Context = this;
         SdlBinding.SDL_SetMainReady();
         var initCode = SdlBinding.SDL_Init(SdlBinding.SDL_INIT_AUDIO);
         if (initCode != 0)
             throw new Exception("SDL initialization failed");
     }

     private void CloseSdl()
     {
         SdlBinding.SDL_Quit();
         if (SDL.Context == this)
         {
             SDL.Context = null;
         }
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.