«Je souhaite utiliser les excellents atouts de C / C ++ dans ** Flutter **.
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
Exécutez avec "** Flutter / Dart => Java / Swift => C / C ++ **"![^ 1] Cette fois, je prendrai Android / Java comme exemple. Bien sûr, Kotlin va bien.
Just Hello World
** les canaux de la plateforme ** seront utilisés.
flutter create -i swift -a java helloworld
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
Maintenant que Dart => Java est bon, écrivons Java => C / C ++ Document officiel est une lecture incontournable.
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 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é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.
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 **
ça devrait ressembler à ça (La partie de com.example.ndktest est cette fois com.example.helloworld)
Sélectionnez Fichier> Invalider les caches / Redémarrer ... pour redémarrer
Si vous pouvez obtenir le comportement comme [Demo](#Completed Demo), c'est OK!
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