Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Xamarin.Android中实现SDL2库?_Java_C#_Android_Xamarin.android_Sdl - Fatal编程技术网

Java 如何在Xamarin.Android中实现SDL2库?

Java 如何在Xamarin.Android中实现SDL2库?,java,c#,android,xamarin.android,sdl,Java,C#,Android,Xamarin.android,Sdl,我需要做什么: 将SDL2源代码编译为x86和ARM64体系结构的.so文件 在Xamarin.Android中引用此文件 在我的C#代码中调用SDL2方法 到目前为止我学到的东西: SDL2需要Java活动或JNI绑定来调用本机代码 如果不将SDL2 libs和JNI集成到Xamarin.Android项目中,我就无法继续 我没有能力解决这个问题,我的大脑在这个过程中崩溃了 我尝试过的事情: 过时的GitHub项目: 这篇博客文章让我创建了C++代码,但没有使用XAMARIN

我需要做什么:

  • 将SDL2源代码编译为x86和ARM64体系结构的.so文件
  • 在Xamarin.Android中引用此文件
  • 在我的C#代码中调用SDL2方法
到目前为止我学到的东西:

  • SDL2需要Java活动或JNI绑定来调用本机代码
  • 如果不将SDL2 libs和JNI集成到Xamarin.Android项目中,我就无法继续
  • 我没有能力解决这个问题,我的大脑在这个过程中崩溃了
我尝试过的事情:

  • 过时的GitHub项目:

    这篇博客文章让我创建了C++代码,但没有使用XAMARIN

  • 通过AndroidStudio运行SDL2,它可以工作,但对我没有帮助,因为我需要调用我的C#代码
我没有广泛的Xamarin知识,所以我不知道如何做到这一点,我现在真的可以使用另一双眼睛。SDL2Droid CS GitHub项目在理论上应该可以工作,但我找不到一种方法来为C#中包含的x86仿真器编译该项目中使用的SDL2

我尝试使用armeabiv7 libsdl2.so编译代码,然后直接在手机上运行。不幸的是,VisualStudio无法调试这一点,因此我很难实现我的代码

接下来,我尝试通过Android Studio调试先前编译的应用程序(使用SDL2Droid CS),它给了我以下错误:

06-19 00:39:55.362 13143-13143/? I/zygote64: Late-enabling -Xcheck:jni
06-19 00:39:55.474 13143-13143/SDL2Droid_CS.SDL2Droid_CS W/ActivityThread: Application SDL2Droid_CS.SDL2Droid_CS can be debugged on port 8100...
06-19 00:39:55.514 13143-13143/? W/monodroid: Creating public update directory: `/data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.__override__`
    Using override path: /data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.__override__
    Using override path: /storage/emulated/0/Android/data/SDL2Droid_CS.SDL2Droid_CS/files/.__override__
    Trying to load sgen from: /data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.__override__/libmonosgen-2.0.so
    Trying to load sgen from: /storage/emulated/0/Android/data/SDL2Droid_CS.SDL2Droid_CS/files/.__override__/libmonosgen-2.0.so
    Trying to load sgen from: /storage/emulated/0/../legacy/Android/data/SDL2Droid_CS.SDL2Droid_CS/files/.__override__/libmonosgen-2.0.so
    Trying to load sgen from: /data/app/SDL2Droid_CS.SDL2Droid_CS-wmPu9Ce48QdJhvYc6bPRiA==/lib/arm64/libmonosgen-2.0.so
    Trying to load sgen from: /data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.__override__/links/libmonosgen-2.0.so
06-19 00:39:55.515 13143-13143/? W/monodroid: Trying to load sgen from: /system/lib/libmonosgen-2.0.so
06-19 00:39:55.515 13143-13143/? A/monodroid: cannot find libmonosgen-2.0.so in override_dir: /data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.__override__, app_libdir: /data/app/SDL2Droid_CS.SDL2Droid_CS-wmPu9Ce48QdJhvYc6bPRiA==/lib/arm64 nor in previously printed locations.
    Do you have a shared runtime build of your app with AndroidManifest.xml android:minSdkVersion < 10 while running on a 64-bit Android 5.0 target? This combination is not supported.
    Please either set android:minSdkVersion >= 10 or use a build without the shared runtime (like default Release configuration).
06-19 00:39:55.362 13143-13143/?I/zygote64:延迟启用-Xcheck:jni
06-19 00:39:55.474 13143-13143/SDL2Droid_CS.SDL2Droid_CS W/ActivityThread:可以在端口8100上调试应用程序SDL2Droid_CS.SDL2Droid_CS。。。
06-19 00:39:55.514 13143-13143/? W/monodroid:创建公共更新目录:`/data/user/0/SDL2Droid\u CS.SDL2Droid\u CS/files/\uu__`
使用覆盖路径:/data/user/0/SDL2Droid\u CS.SDL2Droid\u CS/files/\uu覆盖__
使用覆盖路径:/storage/emulated/0/Android/data/SDL2Droid\u CS.SDL2Droid\u CS/files/__
正在尝试从:/data/user/0/SDL2Droid\u CS.SDL2Droid\u CS/files/.\uuuuu override\uuuuu/libmonosgen-2.0.so加载sgen
正在尝试从:/storage/emulated/0/Android/data/SDL2Droid\u CS.SDL2Droid\u CS/files/.\uuuuu override\uuuu/libmonosgen-2.0.so加载sgen
正在尝试从:/storage/emulated/0/./legacy/Android/data/SDL2Droid\u CS.SDL2Droid\u CS/files/.\uuu覆盖\uuuu/libmonosgen-2.0.so加载sgen
正在尝试从以下位置加载sgen:/data/app/SDL2Droid_CS.SDL2Droid_CS-wmPu9Ce48QdJhvYc6bPRiA==/lib/arm64/libmonosgen-2.0.so
正在尝试从:/data/user/0/SDL2Droid\u CS.SDL2Droid\u CS/files/.\uuu覆盖\uuuu/links/libmonosgen-2.0.so加载sgen
06-19 00:39:55.515 13143-13143/? W/monodroid:尝试从:/system/lib/libmonosgen-2.0.so加载sgen
06-19 00:39:55.515 13143-13143/? A/monodroid:找不到libmonosgen-2.0.so在override_dir:/data/user/0/SDL2Droid_CS.SDL2Droid_CS/files/.app_override_,app_libdir:/data/app/SDL2Droid_CS.SDL2Droid_CS-wmpu9ce48qdjhvyc6bria==/lib/arm64或在以前打印的位置。
在64位android 5.0目标上运行时,您是否有AndroidManifest.xml android:minSdkVersion<10的应用程序共享运行时版本?不支持此组合。
请将android:minSdkVersion>=10或使用没有共享运行时的构建(如默认版本配置)。
MinSDK是19,所以它给出的错误很奇怪

我假设SDL2没有正确实现,这导致了所有这些问题。GitHub代码有一些漏洞,上传它的人还没有激活

资源:

  • SDL2网站:

  • SDL2来源:

  • SDL2Droid GitHub项目:

  • 博客中的GitHub项目:

在我的C#代码中调用SDL2方法

有。这是官方网站上的链接:

您可以下载它并将其编译为
.dll
文件。然后将其添加为项目的引用。您可以通过以下方式调用这些方法:

using SDL2;
SDL.SDL_SetHint(SDL.SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING, "1");

TL;DR:工作文件在这里:

所以我找出了崩溃的原因,这是由于VisualStudio为调试而实现的共享运行时造成的。它是通过在项目设置中禁用共享运行时修复的

项目设置->Android选项->取消勾选“使用共享运行时”

1。关于GitHub代码不起作用的原因:

这是因为“bindings”项目中的.jar文件已损坏。我可以通过自己从SDL2源代码编译.jar文件来修复它。您需要编译的.java文件是,也可以从源代码中获取

一旦有了working.jar,只需从Jars文件夹中删除现有的.jar,并将其替换为新的

如果不能生成.jar文件,可以使用上面链接的GitHub项目中的文件

2。要创建.so文件:

之后,需要编译处理器体系结构所需的.so文件。它是使用Android NDK和make脚本完成的。来自SDL2Droid GitHub的make脚本运行良好,因此我只需更改一些参数,将android minSdkVersion增加到19,并获得所有架构(x86、x86_64、ARM、ARM64)的.so文件

这是生成.so文件的bash代码。如果使用命令提示符,只需将“$NATIVEDIR”更改为项目的绝对路径

如果无法生成这些本机库,则可以使用上面链接的GitHub存储库中的本机库

它们至少需要android-19 sdk,并可用于所有受支持的体系结构

要使用它们,只需将libs文件夹放在Xamarin.Android项目目录中

#!/bin/bash
NATIVEDIR=$(dirname "$0")
ndk-build -j 4 NDK_PROJECT_PATH="$NATIVEDIR/../SDL2Droid-CS" NDK_APPLICATION_MK="$NATIVEDIR/Application.mk"