- bounty将在6天后过期**。回答此问题可获得+50声望奖励。Ramon Brokking希望引起更多人对此问题的关注:比目前给出的更详细的答案。我很想知道让它100%工作的确切方法。
会给奖金赏金,如果它也将工作同样的方式为iOS,我想支持在未来以及.
我有一个. NET MAUI mobile-project,我正在尝试调用从C++编译的代码,即.armv8文件。我正在尝试Process
类来使其工作。
我尝试了以下步骤:
1.在我的项目中将.armv8文件保存为Embedded resource
,并将Copy to output directory
设置为Copy if newer
。该文件位于mobile-project的文件夹中(因此不在项目的平台部分,而是在项目根目录下的文件夹中)。
1.请求Android所需的文件权限(读和写):
PermissionStatus status = await Permissions.RequestAsync<Permissions.StorageRead>();
PermissionStatus status2 = await Permissions.RequestAsync<Permissions.StorageWrite>();
已成功授予这些权限。
1.使用以下代码将文件复制到Android特定的AppData
文件夹:
private string ExtractFiles()
{
var assembly = typeof(App).GetTypeInfo().Assembly;
foreach (var res in assembly.GetManifestResourceNames())
{
if (res.Contains(".armv8"))
{
// read source file
using var stream = assembly.GetManifestResourceStream(res);
using var reader = new StreamReader(stream);
var content = reader.ReadToEnd();
// generate target path inside data folder
string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, res);
// write file into data folder
using FileStream outputStream = System.IO.File.OpenWrite(targetFile);
using StreamWriter streamWriter = new StreamWriter(outputStream);
streamWriter.Write(content);
return targetFile;
}
}
return string.Empty;
}
1.尝试使用以下代码更改要打开的文件权限(参数是步骤2的输出):
public partial void SetPermissionToFile(string path)
{
string[] cmd = { "chmod", "744", path };
Java.Lang.Runtime? runtime = Java.Lang.Runtime.GetRuntime();
runtime?.Exec(cmd);
}
1.使用文件启动进程,代码如下:
_processStartInfo = new ProcessStartInfo
{
FileName = path,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true
};
_process = new Process { StartInfo = _processStartInfo };
_process.Start();
当_process.Start()
方法被调用时,我得到一个Permission denied
错误,如下所示:
这是因为我正在使用一个模拟器吗?或者是文件可能在错误的目录中,进程无法使用?
我看到一个类似的帖子,得到了它的工作,但似乎并不适合我:https://chess.stackexchange.com/questions/17685/how-to-send-uci-messages-from-c-app-to-stockfish-on-android/17856#17856?newreg=ea938bb4ac3147878e4fdc29626050cc
提前感谢你试图帮助我:)
1条答案
按热度按时间y53ybaqx1#
我已经在一个新的. Net Maui项目上测试了你的代码。因为我没有**. armv8文件,所以我用pdf文件代替它。在android上,出现了同样的错误消息。但是当我把
UseShellExecute = false
改为true时。它可以在windows上执行。这是因为我正在使用一个模拟器吗?或者是文件可能在错误的目录中,进程无法使用?
我已经在其他应用的文件夹中测试过了,在小米的实体设备和安卓12模拟器上也测试过了,结果都是一样的。
另外,我根据这个Access denied (0x80004005) on Process.Start() in android app的案例创建了一个新的Xamarin.Android项目,然后我得到了拒绝访问的错误,即使我执行了
string[] cmd = { "chmod", "744", path };
命令,我也不能确定原因是pdf文件不能被授予可执行权限,或者chmod命令不能在更高的Android版本上工作。我也试着测试了chmod 777命令,并用android studio文件资源管理器检查了结果。发现文件权限没有改变。看起来chmod命令不再起作用了。
最后,您可以尝试在Xamarin中测试运行.armv8**文件。根据我提供的链接Android项目,并检查它是否是maui中的bug。您也可以提供文件,我明天会测试它。
我已经尝试了.armv8文件与您的代码,同样的错误出现。我已经检查了chmod命令已成功执行。
然后创建一个新的Xamarin.Android项目,并使用Android Studio的文件资源管理器将文件放入
/data/data/com.companyname.prjecttest/files/_stockfish.android.armv8
路径中,然后运行以下代码:没有错误信息,但也没有任何变化,我可以看到。这似乎是一个错误,在。net maui。你可以尝试报告它的github。