Flutter C/C++集成插件flutter_ccpp的使用

Flutter C/C++集成插件flutter_ccpp的使用

开始使用

本项目是一个用于 Flutter 的插件包,它包括针对 Android 和/或 iOS 平台的特定实现代码。

要开始使用 Flutter,请参阅我们的在线文档,该文档提供了教程、示例、移动开发指南以及完整的 API 参考。

配置混淆脚本

Android (ProGuard)

在构建 APK 之前,配置混淆文件以防止 CCPP 被混淆。

在您的 ProGuard 文件中添加以下行:

# 必须的,以防止 CCPP 被混淆
-keep class com.ccpp.pgw.** { *; }

完整示例

以下是一个完整的示例代码,展示了如何使用 flutter_ccpp 插件。

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_ccpp/flutter_ccpp.dart';
import 'package:flutter_ccpp/pigeon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用 try/catch 来捕获 PlatformException。
    // 我们还处理了消息可能返回 null 的情况。
    try {
      // 设置环境为沙箱
      FlutterCcpp.setup(CcppEnvironment.sandbox);

      // 初始化状态
      platformVersion = 'Initialized';

      // 尝试进行一次新的支付!
      var payment = await FlutterCcpp.makePanCreditCardPayment(
        "kSAops9Zwhos8hSTSeLTUa+y/Hc8FJ1w4/jAGUqhUcMU6mDXSirHZjqtn/wEgJi1w3nONLuU7kSTUYkknSfwRwNsxt7JB+kB+HYMCu5KbquzbbvRgzQEj455GM01dz8e", // 支付令牌
        "4111111111111111", // 卡号
        2, // 月份
        2022, // 年份
        "123", // 安全码
        true // 测试模式
      );

      // 打印支付结果
      print(payment.responseCode);
      print(payment.redirectUrl);
      print(payment.error);
    } catch (e) {
      platformVersion = e.toString();
    }

    // 如果小部件从树中移除而异步平台消息还在飞行中,我们想要丢弃回复而不是调用 setState 更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行于: $_platformVersion\n'),
        ),
      ),
    );
  }
}

更多关于Flutter C/C++集成插件flutter_ccpp的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter C/C++集成插件flutter_ccpp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用C/C++插件flutter_ccpp的示例代码和步骤。这个示例将展示如何在Flutter应用中调用C/C++编写的原生代码。

前提条件

  1. 确保你已经安装了Flutter开发环境。
  2. 确保你熟悉Dart和Flutter的基本操作。

步骤一:创建Flutter插件项目

首先,你需要创建一个Flutter插件项目,如果还没有的话。

flutter create my_flutter_app
cd my_flutter_app

步骤二:添加flutter_ccpp插件

由于flutter_ccpp是一个假想的插件名称,实际中你可能需要创建一个自定义的Flutter插件或使用现有的Flutter插件。这里假设你已经有一个名为flutter_ccpp的插件。

pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_ccpp:
    path: ../path_to_your_flutter_ccpp_plugin  # 如果是本地插件
    # 或者使用远程路径或版本
    # version: ^x.y.z

步骤三:编写C/C++代码

假设你的flutter_ccpp插件需要实现一个简单的加法函数。在插件的iosandroid目录下分别编写C/C++代码。

iOS

ios/Classes目录下创建一个native_code.cpp文件:

// native_code.cpp
#include <jni.h>
#include <flutter/method_channel.h>
#include <string>

extern "C" {
    __attribute__((visibility("default")))
    int32_t add(int32_t a, int32_t b) {
        return a + b;
    }
}

ios/Classes/FlutterCcppPlugin.mm文件中注册方法通道并调用C/C++代码:

#import <Flutter/Flutter.h>
#import "native_code.cpp"

@interface FlutterCcppPlugin : NSObject<FlutterPlugin>
@end

@implementation FlutterCcppPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"flutter_ccpp"
                                     binaryMessenger:registrar.messenger];
    __weak typeof(self) weakSelf = self;
    [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
      if ([@"add" isEqualToString:call.method]) {
        NSNumber *num1 = call.arguments[@"a"];
        NSNumber *num2 = call.arguments[@"b"];
        int32_t a = [num1 intValue];
        int32_t b = [num2 intValue];
        int32_t sum = add(a, b);
        result(@(sum));
      } else {
        result(FlutterMethodNotImplemented);
      }
    }];
}
@end

Android

android/src/main/cpp目录下创建一个CMakeLists.txt文件和一个native_code.cpp文件。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library(
            native-lib
            SHARED
            native_code.cpp)

find_library(
            log-lib
            log)

target_link_libraries(
            native-lib
            ${log-lib})

native_code.cpp:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jint JNICALL
Java_com_example_flutterccpp_NativeLib_add(JNIEnv* env, jobject /* this */, jint a, jint b) {
    return a + b;
}

android/src/main/java/com/example/flutterccpp目录下创建一个NativeLib.java文件:

package com.example.flutterccpp;

public class NativeLib {
    static {
        System.loadLibrary("native-lib");
    }

    public native int add(int a, int b);
}

android/src/main/kotlin/com/example/flutterccpp/FlutterCcppPlugin.kt(或Java)中注册方法通道并调用C/C++代码:

package com.example.flutterccpp

import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import android.app.Activity
import android.content.Context

class FlutterCcppPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
  private lateinit var channel: MethodChannel
  private var context: Context? = null

  override fun onAttachedToEngine(binding: FlutterPluginBinding) {
    channel = MethodChannel(binding.binaryMessenger, "flutter_ccpp")
    channel.setMethodCallHandler(this)
    context = binding.applicationContext
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "add") {
      val a = call.argument<Int>("a") ?: 0
      val b = call.argument<Int>("b") ?: 0
      val sum = NativeLib().add(a, b)
      result.success(sum)
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    binding.addActivityResultListener(this)
  }

  override fun onDetachedFromActivityForConfigChanges() {
    // No-op
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    // No-op
  }

  override fun onDetachedFromActivity() {
    // No-op
  }
}

步骤四:在Flutter中调用C/C++代码

在你的Flutter项目中,你可以通过方法通道调用C/C++代码。在lib/main.dart文件中:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_ccpp/flutter_ccpp.dart'; // 假设有这样一个导入

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('flutter_ccpp');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter C/C++ Integration'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _invokeNativeAdd,
            child: Text('Invoke Native Add'),
          ),
        ),
      ),
    );
  }

  Future<void> _invokeNativeAdd() async {
    try {
      final int result = await platform.invokeMethod('add', <String, dynamic>{'a': 10, 'b': 20});
      print("Result: $result");
    } on PlatformException catch (e) {
      print("Failed to invoke: '${e.message}'.");
    }
  }
}

注意事项

  1. 上述代码示例仅作为演示,实际项目中需要根据具体需求进行调整。
  2. 确保在iOS和Android平台上分别正确配置了CMake和NDK(如果适用)。
  3. 确保插件的注册和调用方法通道的代码正确无误。

通过以上步骤,你可以在Flutter应用中集成并使用C/C++编写的原生代码。

回到顶部