"Ich möchte die hervorragenden Ressourcen von C / C ++ in ** Flutter ** verwenden.
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)
Durchlaufen mit "** Flutter / Dart => Java / Swift => C / C ++ **"![^ 1] Dieses Mal werde ich Android / Java als Beispiel nehmen. Natürlich geht es Kotlin gut.
Nur Hallo Welt
** Plattformkanäle ** werden verwendet.
flutter create -i swift -a java helloworld
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
Nun, da Dart => Java gut ist, schreiben wir Java => C / C ++ Offizielles Dokument ist ein Muss.
Öffnen Sie nur das * Android-Verzeichnis * des vorherigen Projekts in Android Studio. Öffnen Sie dann Tool> SDK Manager> SDK Tools und installieren Sie Folgendes.
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" 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.
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 **
Es sollte so aussehen (Der Teil von com.example.ndktest ist diesmal com.example.helloworld)
Wählen Sie Datei> Caches ungültig machen / neu starten ..., um neu zu starten
Wenn Sie das Verhalten wie [Demo](#Completed Demo) erhalten können, ist es OK!
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