[JAVA] [Flutter] Comment utiliser C / C ++ depuis Dart?

Une telle scène

«Je souhaite utiliser les excellents atouts de C / C ++ dans ** Flutter **.

Conclusion

Flutter / Dart => C / C ++ est difficile

Le problème «Prise en charge de l'intégration avec C / C ++ dans le cadre de plugins» est publié dans le référentiel de Flutter. Malheureusement, cela semble être strict ... (au 16 juin 2018) Pressons beaucoup de "j'aime" pour obtenir une priorité plus élevée! !! !!

De plus, simplement Dart => C / C ++ peut être go

Passons en revue Java et Swift

Exécutez avec "** Flutter / Dart => Java / Swift => C / C ++ **"![^ 1] Cette fois, je prendrai Android / Java comme exemple. Bien sûr, Kotlin va bien.

Démo d'achèvement

Just Hello World 2018-06-04 01.19.10.gif

la mise en oeuvre

Appeler Java depuis Flutter / Dart

** les canaux de la plateforme ** seront utilisés.

Création de projet

flutter create -i swift -a java helloworld

Appeler Java en utilisant le canal

Copiez ce qui suit dans main.dart

main.dart


import 'dart:async';

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

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel('helloworld/hello');
  String _greeting = 'Nothing';

  Future<Null> _getGreeting() async {
    String greeting;
    try {
      final String result = await platform.invokeMethod('getGreeting');
      greeting = result;
    } on PlatformException catch (e) {
      greeting = "Failed to get greeting: '${e.message}'.";
    }

    setState(() {
      _greeting = greeting;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Material(
    child: new Center(
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          new RaisedButton(
            child: new Text('Get Greeting'),
            onPressed: _getGreeting,
          ),
          new Text(_greeting),
        ],
      ),
    ),
  );
  }
}

Il y a trois points.

--static const platform = const MethodChannel ('helloworld / hello'); ← ** MethodChannel ** spécifié --Future <Null> _getGreeting () async {} ← ** Appel asynchrone ** --ʻAwait platform.invokeMethod ('getGreeting'); `← ** Spécifiez le nom de la méthode ** et appelez

Appeler C / C ++ depuis Android / Java

Maintenant que Dart => Java est bon, écrivons Java => C / C ++ Document officiel est une lecture incontournable.

Maintenance de l'environnement Android Studio

Ouvrez uniquement le * répertoire android * du projet précédent dans Android Studio. Ensuite, ouvrez Outil> Gestionnaire SDK> Outils SDK et installez ce qui suit.

Ajouté C / C ++

Ajout du répertoire cpp au répertoire principal. (Le nom peut être n'importe quoi, mais cette fois ce sera cpp) Ajoutez ensuite native-lib.c au répertoire cpp et copiez ce qui suit.

native-lib.c


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

jstring
Java_com_example_helloworld_MainActivity_getGreetingFromJNI( JNIEnv* env, jobject thiz ) {
    return (*env)->NewStringUTF(env, "Hello World. I'm Android.");
}

Le nom de la fonction doit être "** Java_path pour atteindre le fichier java cible \ _Hoge.java_method name **".

Créer CMakeLists.txt

Créez CMakeLists.txt dans le répertoire de l'application et copiez ce qui suit

CMakeLists.txt


# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.c )

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

La dernière ligne vous indique où trouver le fichier d'en-tête. Je n'ai pas besoin d'utiliser le fichier d'en-tête cette fois, mais je l'ai écrit car il devrait être utilisé normalement.

Modifier MainActivity.java

Copiez ce qui suit.

MainActivity.java


package com.example.helloworld;

import android.os.Bundle;

import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;
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;

public class MainActivity extends FlutterActivity {

  private static final String CHANNEL = "helloworld/hello";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodCallHandler() {
              @Override
              public void onMethodCall(MethodCall call, Result result) {
                if (call.method.equals("getGreeting")) {
                  String greeting = getGreeting();
                  result.success(greeting);
                } else {
                  result.notImplemented();
                }
              }
            });
  }

  private String getGreeting() {
    return getGreetingFromJNI();
  }

  public native String  getGreetingFromJNI();

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

3 points

--private static final String CHANNEL = "helloworld / hello"; ← ** Spécifiez le même nom de canal ** que précédemment --static {System.loadLibrary ("native-lib");} .so Le fichier est chargé. --public native String getGreetingFromJNI (); ← ** Spécifiez la méthode C précédemment définie **

Lien Gradle

  1. Faites un clic droit sur le répertoire de l'application et sélectionnez "Lier un projet C ++ avec Gradle"
  2. Sélectionnez CMake pour Build System
  3. Spécifiez le CMakeLists.txt créé précédemment dans ProjectPath.
  4. Cliquez sur OK

Dessin d'achèvement

ça devrait ressembler à ça (La partie de com.example.ndktest est cette fois com.example.helloworld) スクリーンショット 2018-06-04 1.40.58.png

Si le symbole ne peut pas résoudre apparaît

Sélectionnez Fichier> Invalider les caches / Redémarrer ... pour redémarrer

Commencez

Si vous pouvez obtenir le comportement comme [Demo](#Completed Demo), c'est OK!

en conclusion

C'est un problème d'écrire à la fois java et swift pour appeler C / C ++. J'ai hâte que le problème github soit résolu ...

[^ 1]: La raison du choix de Java est que la quantité d'informations sur NDK est Java> Kotlin.

Recommended Posts

[Flutter] Comment utiliser C / C ++ depuis Dart?
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser JUnit (débutant)
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Utiliser le programme C de Ruby
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java
Comment utiliser Big Decimal
[Java] Comment utiliser removeAll ()
Comment utiliser String [] args
Comment utiliser la jonction de rails
Comment utiliser Java Map
Ruby: Comment utiliser les cookies
Comment utiliser Dependant :: Destroy
Comment utiliser Eclipse Debug_Shell
Comment utiliser Apache POI
[Rails] Comment utiliser la validation
Comment utiliser les variables Java
[Débutant] Comment utiliser la conception Modifier les paramètres depuis l'introduction
[Rails] Comment utiliser authenticate_user!
Comment utiliser GC Viewer
Comment utiliser Lombok maintenant
[Création] Comment utiliser JUnit
[Rails] Comment utiliser Scope
[Rails 5] Comment utiliser gem gon ~ Comment passer des variables de Rails à JS ~
Comment appliquer le format de code C à partir de la ligne de commande
Comment utiliser la méthode link_to
[Rails] Comment utiliser la "devise" des gemmes
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.