mirror of
https://github.com/wgh136/flutter_qjs.git
synced 2025-09-27 05:27:23 +00:00
ffi android
This commit is contained in:
34
lib/ffi.dart
34
lib/ffi.dart
@@ -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();
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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)) {
|
||||
|
Reference in New Issue
Block a user