1

我不是 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
4

0 回答 0