[JAVA] [Flattern] Wie verwende ich C / C ++ von Dart?

Eine solche Szene

"Ich möchte die hervorragenden Ressourcen von C / C ++ in ** Flutter ** verwenden.

Fazit

Flattern / Dart => C / C ++ ist hart

Das Problem "Unterstützung der Integration in C / C ++ im Plugin-Framework" wird im Flutter-Repository veröffentlicht. Leider scheint es streng zu sein ... (Stand 16. Juni 2018) Lassen Sie uns viele "Likes" drücken, um eine höhere Priorität zu erhalten! !! !!

Außerdem kann einfach Dart => C / C ++ [go] sein (https://www.dartlang.org/articles/dart-vm/native-extensions)

Lassen Sie uns durch Java und Swift gehen

Durchlaufen mit "** Flutter / Dart => Java / Swift => C / C ++ **"![^ 1] Dieses Mal werde ich Android / Java als Beispiel nehmen. Natürlich geht es Kotlin gut.

Abschlussdemo

Nur Hallo Welt 2018-06-04 01.19.10.gif

Implementierung

Rufen Sie Java von Flutter / Dart aus auf

** Plattformkanäle ** werden verwendet.

Projekterstellung

flutter create -i swift -a java helloworld

Rufen Sie Java über den Kanal auf

Kopieren Sie Folgendes in 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),
        ],
      ),
    ),
  );
  }
}

Es gibt drei Punkte.

--static const platform = const MethodChannel ('helloworld / hello'); ← ** MethodChannel ** angegeben --Future <Null> _getGreeting () async {} ← ** Asynchroner ** Aufruf --await platform.invokeMethod ('getGreeting'); ← ** Geben Sie den Methodennamen ** an und rufen Sie auf

Rufen Sie C / C ++ von Android / Java aus auf

Nun, da Dart => Java gut ist, schreiben wir Java => C / C ++ Offizielles Dokument ist ein Muss.

Wartung der Android Studio-Umgebung

Öffnen Sie nur das * Android-Verzeichnis * des vorherigen Projekts in Android Studio. Öffnen Sie dann Tool> SDK Manager> SDK Tools und installieren Sie Folgendes.

C / C ++ hinzugefügt

Cpp-Verzeichnis zum Hauptverzeichnis hinzugefügt. (Der Name kann alles sein, aber diesmal wird es cpp sein) Fügen Sie dann native-lib.c zum cpp-Verzeichnis hinzu und kopieren Sie Folgendes.

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.");
}

Der Funktionsname sollte "** Java_path sein, um die Java-Zieldatei \ _Hoge.java_method name ** zu erreichen".

Erstellen Sie CMakeLists.txt

Erstellen Sie "CMakeLists.txt" im App-Verzeichnis und kopieren Sie Folgendes

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/)

In der letzten Zeile erfahren Sie, wo sich die Header-Datei befindet. Diesmal muss ich die Header-Datei nicht verwenden, aber ich habe sie geschrieben, weil sie normal verwendet werden sollte.

Bearbeiten Sie MainActivity.java

Kopieren Sie Folgendes.

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 Punkte

--private static final String CHANNEL = "helloworld / hello"; ← ** Geben Sie den gleichen Kanalnamen ** wie zuvor an --static {System.loadLibrary ("native-lib");} .so Die Datei wird geladen. --public native String getGreetingFromJNI (); ← ** Geben Sie die zuvor definierte C-Methode an **

Gradle Link

  1. Klicken Sie mit der rechten Maustaste auf das App-Verzeichnis und wählen Sie "C ++ - Projekt mit Gradle verknüpfen".
  2. Wählen Sie CMake for Build System
  3. Geben Sie die CMakeLists.txt an, die zuvor in ProjectPath erstellt wurde.
  4. Klicken Sie auf OK

Abschlusszeichnung

Es sollte so aussehen (Der Teil von com.example.ndktest ist diesmal com.example.helloworld) スクリーンショット 2018-06-04 1.40.58.png

Wenn nicht aufgelöst werden kann, wird das Symbol angezeigt

Wählen Sie Datei> Caches ungültig machen / neu starten ..., um neu zu starten

Anlaufen

Wenn Sie das Verhalten wie [Demo](#Completed Demo) erhalten können, ist es OK!

abschließend

Es ist mühsam, sowohl Java als auch schnell C / C ++ aufzurufen. Ich kann es kaum erwarten, bis das Github-Problem behoben ist ...

[^ 1]: Der Grund für die Auswahl von Java ist, dass die Menge an Informationen zu NDK Java> Kotlin ist.

Recommended Posts

[Flattern] Wie verwende ich C / C ++ von Dart?
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von java.util.logging
Verwendung der Karte
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
[Rails] Verwendung von Enum
Verwendung von Java Optional
Verwendung von JUnit (Anfänger)
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwenden Sie das C-Programm von Ruby
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Rails Join
Verwendung von Java Map
Ruby: Wie man Cookies benutzt
Verwendung von abhängigen :: zerstören
Verwendung von Eclipse Debug_Shell
Verwendung von Apache POI
[Rails] Verwendung der Validierung
Verwendung von Java-Variablen
[Anfänger] Verwendung des Geräts Ändern Sie die Einstellungen ab Einführung
[Rails] So verwenden Sie authenticate_user!
Verwendung von GC Viewer
Wie man Lombok jetzt benutzt
[Erstellen] Verwendung von JUnit
[Schienen] Verwendung von Scope
[Rails 5] Verwendung von gem gon ~ Übergabe von Variablen von Rails an JS ~
So wenden Sie das C-Code-Format über die Befehlszeile an
Verwendung der link_to-Methode
[Rails] Wie man Edelstein "devise" benutzt
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.