如何在Flutter中使用dart:ffi打印到控制台? 尝试运行我的颤动应用程序(Android上)时,我会通过以下C++代码运行: #包括 std::cout

如何在Flutter中使用dart:ffi打印到控制台? 尝试运行我的颤动应用程序(Android上)时,我会通过以下C++代码运行: #包括 std::cout,android,c++,flutter,dart,dart-ffi,Android,C++,Flutter,Dart,Dart Ffi,Edit:当只在android上运行时,有一种更简单的方法。我已经更新了下面的答案 您必须将print函数的包装器传递到本机代码中 void wrappedPrint(指针arg){ 打印(Utf8.fromUtf8(arg)); } typedef _wrappedPrint_C=无效函数(指针a); final wrappedPrintPointer=Pointer.from函数(_wrappedPrint_C); 最终void函数(指针)初始化= _国家图书馆 .lookup(“初始化”)

Edit:当只在android上运行时,有一种更简单的方法。我已经更新了下面的答案

您必须将print函数的包装器传递到本机代码中

void wrappedPrint(指针arg){
打印(Utf8.fromUtf8(arg));
}
typedef _wrappedPrint_C=无效函数(指针a);
final wrappedPrintPointer=Pointer.from函数(_wrappedPrint_C);
最终void函数(指针)初始化=
_国家图书馆
.lookup(“初始化”)
.asFunction();
初始化(wrappedPrintPointer);
然后在C库中使用它:

void (*print)(char *);

void initialize(void (*printCallback)(char *)) {
    print = printCallback;
    print("C library initialized");
}

void someOtherFunction() {
    print("Hello World");
}

当只在android上运行时,事情会变得更简单。执行以下操作,而不是上述所有操作:

只要使用android日志机制,它就会显示在控制台上,至少在使用
flatterrun
时是这样。我假设Flatter使用应用程序的PID连接到logcat

为此,请使用以下内容更新CMakeLists.txt:

find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

              # Specifies the name of the NDK library that
              # CMake needs to locate.
              log )

# Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
                       <your-libs-name-here>

                       # Links the log library to the target library.
                       ${log-lib} )
find_library(#定义存储
#NDK库的位置。
日志库
#指定要创建的NDK库的名称
#CMake需要定位。
日志)
#将本机库链接到一个或多个其他本机库。
目标链接库(#指定目标库。
#将日志库链接到目标库。
${log lib})
在c库中执行以下操作:

#include <android/log.h>

void someOtherFunction() {
      __android_log_print(ANDROID_LOG_DEBUG, "flutter", "Hello world! You can use %s", "formatting");
}
#包括
void someOtherFunction(){
__android_log_print(android_log_调试,“颤振”,“你好,世界!您可以使用%s”,“格式化”);
}

您能使用
\uuuAndroid\uLog\uPrint吗(ANDROID_LOG_VERBOSE,
?需要一个条件包含,因为显然只有ANDROID才需要。@RichardHeap感谢您指出这一点。我尝试了
#ifdef_uuuandroid_API_35;include。看起来我需要像上面说的那样包含它。但是,这只会出现在Logcat中,我想在Flutter控制台中阅读输出。非常有用!谢谢。似乎到2021年5月(ffi v 1.0.0)为止,第一个解决方案似乎不起作用,我得到一个错误
dart:ffi只支持从本机代码调用静态dart函数。