我不是 C++ 程序员,但想使用 Google 的 Oboe 库来实现低延迟音频。目前我正在使用 AudioTrack,但速度不够快。
我正在尝试使用 CppSharp 生成 P/Inoke 包装器。这甚至支持 libOboe.so 文件吗?我为 .Net Framework v4.7.2 编写了一个控制台应用程序。必须将 Platform 目标设置为 x64,否则它不会加载 CppSharp.Parser 库(格式无效)。
它做了一些事情,但只会产生错误。尝试将 ParseSourceFile 更改为 ParseLibrary 仅导致 NotFound。
除了 GitHub 上的内容之外,还有其他文档吗?
好的,这是我从 CppSharp 项目的 GitHub 上的示例目录中复制的代码
using CppSharp.Parser;
using cps = CppSharp; // Had to make this change, see below
using System;
using System.IO;
namespace ElectroSpit.CppSharp
{
class Program
{
// This is the library I'm trying to parse
private static string m_Library = @"C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so";
static void Main(string[] args)
{
try
{
ParseSourceFile(m_Library, LanguageVersion.C99);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
Console.ReadKey();
}
public static bool ParseSourceFile(string file, LanguageVersion lversion)
{
var parserOptions = new ParserOptions
{
LanguageVersion = lversion,
Verbose = true
};
parserOptions.Setup();
// With only the using CppSharp.Parser there is a ClangParser class but it
// did not have the ParseSourceFile below. So I improvised the 'cps' see above
// So there are 2 entries for ClangParser. Maybe this ambiguity is biting me?
var parser = new cps.ClangParser();
// Changing ParseSourceFile() to ParseLibrary() results in NotFound error
var parserResult = parser.ParseSourceFile(file, parserOptions);
if (parserResult.Kind != ParserResultKind.Success)
{
if (parserResult.Kind == ParserResultKind.FileNotFound)
Console.Error.WriteLine($"{file} was not found.");
for (uint i = 0; i < parserResult.DiagnosticsCount; i++)
{
var diag = parserResult.GetDiagnostics(i);
Console.WriteLine("{0}({1},{2}): {3}: {4}",
diag.FileName, diag.LineNumber, diag.ColumnNumber,
diag.Level.ToString().ToLower(), diag.Message);
}
parserResult.Dispose();
return false;
}
var astContext = cps.ClangParser.ConvertASTContext(parserOptions.ASTContext);
parserResult.Dispose();
// Now we can finally do what we please with the syntax tree.
foreach (var sourceUnit in astContext.TranslationUnits)
Console.WriteLine(sourceUnit.FileName);
return true;
}
}
}
这是输出的一部分。它看起来好像将库视为名称 ParseSourceFile() 所暗示的文本文件。将其更改为 ParseLibrary() 只会导致 NotFound 错误。
Compiler argument: -xc
Compiler argument: -std=c99
Compiler argument: -fno-rtti
Compiler argument: -fms-extensions
Compiler argument: -fms-compatibility
Compiler argument: -fdelayed-template-parsing
Target triple: x86_64-pc-windows-msvc
#include "..." search starts here:
#include <...> search starts here:
lib\clang\11.0.0\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.25.28610\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.25.28610\atlmfc\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt
End of search list.
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,1): error: expected identifier or '('
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,8): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,9): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,10): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,11): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,12): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,13): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,14): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,15): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,16): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,18): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,20): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,22): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,23): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,24): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,25): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,26): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,27): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,28): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,29): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,30): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,31): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,32): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,34): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,35): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,36): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,37): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,38): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,39): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,40): warning: null character ignored
C:/Projects/TinyGreenBits/ElectroSpit/ElectroSpit/ElectroSpit.Android/libs/x86_64/liboboe.so(1,41): error: source file is not valid UTF-8