ffi android

This commit is contained in:
ekibun
2020-09-21 14:45:04 +08:00
parent 9175871678
commit 53671c8be0
18 changed files with 81 additions and 2366 deletions

View File

@@ -3,7 +3,7 @@
* @Author: ekibun
* @Date: 2020-09-19 10:29:04
* @LastEditors: ekibun
* @LastEditTime: 2020-09-21 01:30:41
* @LastEditTime: 2020-09-21 14:25:47
*/
import 'dart:ffi';
import 'dart:io';
@@ -53,7 +53,31 @@ final DynamicLibrary qjsLib = Platform.environment['FLUTTER_TEST'] == 'true'
? (Platform.isWindows
? DynamicLibrary.open("test/build/Debug/flutter_qjs.dll")
: DynamicLibrary.process())
: (Platform.isWindows ? DynamicLibrary.open("flutter_qjs_plugin.dll") : DynamicLibrary.process());
: (Platform.isWindows
? DynamicLibrary.open("flutter_qjs_plugin.dll")
: Platform.isAndroid
? DynamicLibrary.open("libqjs.so")
: DynamicLibrary.process());
/// JSValue *jsThrowInternalError(JSContext *ctx, char *message)
final Pointer Function(
Pointer ctx,
Pointer<Utf8> message,
) _jsThrowInternalError = qjsLib
.lookup<
NativeFunction<
Pointer Function(
Pointer,
Pointer<Utf8>,
)>>("jsThrowInternalError")
.asFunction();
Pointer jsThrowInternalError(Pointer ctx, String message) {
var utf8message = Utf8.toUtf8(message);
var val = _jsThrowInternalError(ctx, utf8message);
free(utf8message);
return val;
}
/// JSValue *jsEXCEPTION()
final Pointer Function() jsEXCEPTION =
@@ -95,7 +119,9 @@ Pointer jsNewRuntime(
ReceivePort port,
) {
var rt = _jsNewRuntime(Pointer.fromFunction(channelDispacher));
runtimeOpaques[rt] = RuntimeOpaque()..channel = callback..port = port;
runtimeOpaques[rt] = RuntimeOpaque()
..channel = callback
..port = port;
return rt;
}
@@ -696,4 +722,4 @@ final int Function(
Int32 Function(
Pointer,
)>>("jsExecutePendingJob")
.asFunction();
.asFunction();

View File

@@ -3,10 +3,11 @@
* @Author: ekibun
* @Date: 2020-08-08 08:29:09
* @LastEditors: ekibun
* @LastEditTime: 2020-09-21 01:36:30
* @LastEditTime: 2020-09-21 13:46:50
*/
import 'dart:async';
import 'dart:ffi';
import 'dart:io';
import 'dart:isolate';
import 'package:ffi/ffi.dart';
@@ -29,17 +30,27 @@ class FlutterQjs {
_ensureEngine() {
if (_rt != null) return;
_rt = jsNewRuntime((ctx, method, argv) {
if (method.address != 0) {
var argvs = jsToDart(ctx, argv);
if (methodHandler == null) throw Exception("No MethodHandler");
return dartToJs(ctx, methodHandler(Utf8.fromUtf8(method.cast<Utf8>()), argvs));
try {
if (method.address != 0) {
if (methodHandler == null) throw Exception("No MethodHandler");
var argvs = jsToDart(ctx, argv);
return dartToJs(ctx, methodHandler(Utf8.fromUtf8(method.cast<Utf8>()), argvs));
}
if (moduleHandler == null) throw Exception("No ModuleHandler");
var ret = Utf8.toUtf8(moduleHandler(Utf8.fromUtf8(argv.cast<Utf8>())));
Future.microtask(() {
free(ret);
});
return ret;
} catch (e, stack) {
var err = jsThrowInternalError(ctx, e.toString() + "\n" + stack.toString());
if (method.address == 0) {
jsFreeValue(ctx, err);
deleteJSValue(err);
return Pointer.fromAddress(0);
}
return err;
}
if (moduleHandler == null) throw Exception("No ModuleHandler");
var ret = Utf8.toUtf8(moduleHandler(Utf8.fromUtf8(argv.cast<Utf8>())));
Future.microtask(() {
free(ret);
});
return ret;
}, port);
_ctx = jsNewContextWithPromsieWrapper(_rt);
}

View File

@@ -3,7 +3,7 @@
* @Author: ekibun
* @Date: 2020-09-19 22:07:47
* @LastEditors: ekibun
* @LastEditTime: 2020-09-21 01:23:06
* @LastEditTime: 2020-09-21 13:56:53
*/
import 'dart:async';
import 'dart:ffi';
@@ -53,7 +53,10 @@ class JSPromise extends JSRefValue {
return true;
}
if (status["__rejected"] == true) {
completer.completeError(status["__error"] ?? "undefined");
completer.completeError(parseJSException(
ctx,
e: jsGetPropertyStr(ctx, val, "__error"),
));
return true;
}
return false;
@@ -93,8 +96,8 @@ Pointer jsGetPropertyStr(Pointer ctx, Pointer val, String prop) {
return jsProp;
}
String parseJSException(Pointer ctx) {
Pointer e = jsGetException(ctx);
String parseJSException(Pointer ctx, {Pointer e}) {
e = e ?? jsGetException(ctx);
var err = jsToCString(ctx, e);
if (jsValueGetTag(e) == JSTag.OBJECT) {
Pointer stack = jsGetPropertyStr(ctx, e, "stack");
@@ -192,7 +195,7 @@ dynamic jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
int size = psize.value;
free(psize);
if (buf.address != 0) {
return buf.asTypedList(size);
return Uint8List.fromList(buf.asTypedList(size));
}
int valptr = jsValueGetPtr(val).address;
if (cache.containsKey(valptr)) {