mirror of
https://github.com/flutter/samples.git
synced 2025-11-08 22:09:06 +00:00
Flutter 3.29 beta (#2571)
This commit is contained in:
3909
pedometer/src/dart-sdk/include/dart_api.h
Normal file
3909
pedometer/src/dart-sdk/include/dart_api.h
Normal file
File diff suppressed because it is too large
Load Diff
59
pedometer/src/dart-sdk/include/dart_api_dl.c
Normal file
59
pedometer/src/dart-sdk/include/dart_api_dl.c
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
* for details. All rights reserved. Use of this source code is governed by a
|
||||
* BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "dart_api_dl.h" /* NOLINT */
|
||||
#include "dart_version.h" /* NOLINT */
|
||||
#include "internal/dart_api_dl_impl.h" /* NOLINT */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define DART_API_DL_DEFINITIONS(name, R, A) name##_Type name##_DL = NULL;
|
||||
|
||||
DART_API_ALL_DL_SYMBOLS(DART_API_DL_DEFINITIONS)
|
||||
|
||||
#undef DART_API_DL_DEFINITIONS
|
||||
|
||||
typedef void* DartApiEntry_function;
|
||||
|
||||
DartApiEntry_function FindFunctionPointer(const DartApiEntry* entries,
|
||||
const char* name) {
|
||||
while (entries->name != NULL) {
|
||||
if (strcmp(entries->name, name) == 0) return entries->function;
|
||||
entries++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
intptr_t Dart_InitializeApiDL(void* data) {
|
||||
DartApi* dart_api_data = (DartApi*)data;
|
||||
|
||||
if (dart_api_data->major != DART_API_DL_MAJOR_VERSION) {
|
||||
// If the DartVM we're running on does not have the same version as this
|
||||
// file was compiled against, refuse to initialize. The symbols are not
|
||||
// compatible.
|
||||
return -1;
|
||||
}
|
||||
// Minor versions are allowed to be different.
|
||||
// If the DartVM has a higher minor version, it will provide more symbols
|
||||
// than we initialize here.
|
||||
// If the DartVM has a lower minor version, it will not provide all symbols.
|
||||
// In that case, we leave the missing symbols un-initialized. Those symbols
|
||||
// should not be used by the Dart and native code. The client is responsible
|
||||
// for checking the minor version number himself based on which symbols it
|
||||
// is using.
|
||||
// (If we would error out on this case, recompiling native code against a
|
||||
// newer SDK would break all uses on older SDKs, which is too strict.)
|
||||
|
||||
const DartApiEntry* dart_api_function_pointers = dart_api_data->functions;
|
||||
|
||||
#define DART_API_DL_INIT(name, R, A) \
|
||||
name##_DL = \
|
||||
(name##_Type)(FindFunctionPointer(dart_api_function_pointers, #name));
|
||||
DART_API_ALL_DL_SYMBOLS(DART_API_DL_INIT)
|
||||
#undef DART_API_DL_INIT
|
||||
|
||||
return 0;
|
||||
}
|
||||
150
pedometer/src/dart-sdk/include/dart_api_dl.h
Normal file
150
pedometer/src/dart-sdk/include/dart_api_dl.h
Normal file
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
* for details. All rights reserved. Use of this source code is governed by a
|
||||
* BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef RUNTIME_INCLUDE_DART_API_DL_H_
|
||||
#define RUNTIME_INCLUDE_DART_API_DL_H_
|
||||
|
||||
#include "dart_api.h" /* NOLINT */
|
||||
#include "dart_native_api.h" /* NOLINT */
|
||||
|
||||
/** \mainpage Dynamically Linked Dart API
|
||||
*
|
||||
* This exposes a subset of symbols from dart_api.h and dart_native_api.h
|
||||
* available in every Dart embedder through dynamic linking.
|
||||
*
|
||||
* All symbols are postfixed with _DL to indicate that they are dynamically
|
||||
* linked and to prevent conflicts with the original symbol.
|
||||
*
|
||||
* Link `dart_api_dl.c` file into your library and invoke
|
||||
* `Dart_InitializeApiDL` with `NativeApi.initializeApiDLData`.
|
||||
*/
|
||||
|
||||
DART_EXPORT intptr_t Dart_InitializeApiDL(void* data);
|
||||
|
||||
// ============================================================================
|
||||
// IMPORTANT! Never update these signatures without properly updating
|
||||
// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION.
|
||||
//
|
||||
// Verbatim copy of `dart_native_api.h` and `dart_api.h` symbol names and types
|
||||
// to trigger compile-time errors if the sybols in those files are updated
|
||||
// without updating these.
|
||||
//
|
||||
// Function return and argument types, and typedefs are carbon copied. Structs
|
||||
// are typechecked nominally in C/C++, so they are not copied, instead a
|
||||
// comment is added to their definition.
|
||||
typedef int64_t Dart_Port_DL;
|
||||
|
||||
typedef void (*Dart_NativeMessageHandler_DL)(Dart_Port_DL dest_port_id,
|
||||
Dart_CObject* message);
|
||||
|
||||
// dart_native_api.h symbols can be called on any thread.
|
||||
#define DART_NATIVE_API_DL_SYMBOLS(F) \
|
||||
/***** dart_native_api.h *****/ \
|
||||
/* Dart_Port */ \
|
||||
F(Dart_PostCObject, bool, (Dart_Port_DL port_id, Dart_CObject * message)) \
|
||||
F(Dart_PostInteger, bool, (Dart_Port_DL port_id, int64_t message)) \
|
||||
F(Dart_NewNativePort, Dart_Port_DL, \
|
||||
(const char* name, Dart_NativeMessageHandler_DL handler, \
|
||||
bool handle_concurrently)) \
|
||||
F(Dart_CloseNativePort, bool, (Dart_Port_DL native_port_id))
|
||||
|
||||
// dart_api.h symbols can only be called on Dart threads.
|
||||
#define DART_API_DL_SYMBOLS(F) \
|
||||
/***** dart_api.h *****/ \
|
||||
/* Errors */ \
|
||||
F(Dart_IsError, bool, (Dart_Handle handle)) \
|
||||
F(Dart_IsApiError, bool, (Dart_Handle handle)) \
|
||||
F(Dart_IsUnhandledExceptionError, bool, (Dart_Handle handle)) \
|
||||
F(Dart_IsCompilationError, bool, (Dart_Handle handle)) \
|
||||
F(Dart_IsFatalError, bool, (Dart_Handle handle)) \
|
||||
F(Dart_GetError, const char*, (Dart_Handle handle)) \
|
||||
F(Dart_ErrorHasException, bool, (Dart_Handle handle)) \
|
||||
F(Dart_ErrorGetException, Dart_Handle, (Dart_Handle handle)) \
|
||||
F(Dart_ErrorGetStackTrace, Dart_Handle, (Dart_Handle handle)) \
|
||||
F(Dart_NewApiError, Dart_Handle, (const char* error)) \
|
||||
F(Dart_NewCompilationError, Dart_Handle, (const char* error)) \
|
||||
F(Dart_NewUnhandledExceptionError, Dart_Handle, (Dart_Handle exception)) \
|
||||
F(Dart_PropagateError, void, (Dart_Handle handle)) \
|
||||
/* Dart_Handle, Dart_PersistentHandle, Dart_WeakPersistentHandle */ \
|
||||
F(Dart_HandleFromPersistent, Dart_Handle, (Dart_PersistentHandle object)) \
|
||||
F(Dart_HandleFromWeakPersistent, Dart_Handle, \
|
||||
(Dart_WeakPersistentHandle object)) \
|
||||
F(Dart_NewPersistentHandle, Dart_PersistentHandle, (Dart_Handle object)) \
|
||||
F(Dart_SetPersistentHandle, void, \
|
||||
(Dart_PersistentHandle obj1, Dart_Handle obj2)) \
|
||||
F(Dart_DeletePersistentHandle, void, (Dart_PersistentHandle object)) \
|
||||
F(Dart_NewWeakPersistentHandle, Dart_WeakPersistentHandle, \
|
||||
(Dart_Handle object, void* peer, intptr_t external_allocation_size, \
|
||||
Dart_HandleFinalizer callback)) \
|
||||
F(Dart_DeleteWeakPersistentHandle, void, (Dart_WeakPersistentHandle object)) \
|
||||
F(Dart_UpdateExternalSize, void, \
|
||||
(Dart_WeakPersistentHandle object, intptr_t external_allocation_size)) \
|
||||
F(Dart_NewFinalizableHandle, Dart_FinalizableHandle, \
|
||||
(Dart_Handle object, void* peer, intptr_t external_allocation_size, \
|
||||
Dart_HandleFinalizer callback)) \
|
||||
F(Dart_DeleteFinalizableHandle, void, \
|
||||
(Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object)) \
|
||||
F(Dart_UpdateFinalizableExternalSize, void, \
|
||||
(Dart_FinalizableHandle object, Dart_Handle strong_ref_to_object, \
|
||||
intptr_t external_allocation_size)) \
|
||||
/* Dart_Port */ \
|
||||
F(Dart_Post, bool, (Dart_Port_DL port_id, Dart_Handle object)) \
|
||||
F(Dart_NewSendPort, Dart_Handle, (Dart_Port_DL port_id)) \
|
||||
F(Dart_SendPortGetId, Dart_Handle, \
|
||||
(Dart_Handle port, Dart_Port_DL * port_id)) \
|
||||
/* Scopes */ \
|
||||
F(Dart_EnterScope, void, ()) \
|
||||
F(Dart_ExitScope, void, ())
|
||||
|
||||
#define DART_API_ALL_DL_SYMBOLS(F) \
|
||||
DART_NATIVE_API_DL_SYMBOLS(F) \
|
||||
DART_API_DL_SYMBOLS(F)
|
||||
// IMPORTANT! Never update these signatures without properly updating
|
||||
// DART_API_DL_MAJOR_VERSION and DART_API_DL_MINOR_VERSION.
|
||||
//
|
||||
// End of verbatim copy.
|
||||
// ============================================================================
|
||||
|
||||
// Copy of definition of DART_EXPORT without 'used' attribute.
|
||||
//
|
||||
// The 'used' attribute cannot be used with DART_API_ALL_DL_SYMBOLS because
|
||||
// they are not function declarations, but variable declarations with a
|
||||
// function pointer type.
|
||||
//
|
||||
// The function pointer variables are initialized with the addresses of the
|
||||
// functions in the VM. If we were to use function declarations instead, we
|
||||
// would need to forward the call to the VM adding indirection.
|
||||
#if defined(__CYGWIN__)
|
||||
#error Tool chain and platform not supported.
|
||||
#elif defined(_WIN32)
|
||||
#if defined(DART_SHARED_LIB)
|
||||
#define DART_EXPORT_DL DART_EXTERN_C __declspec(dllexport)
|
||||
#else
|
||||
#define DART_EXPORT_DL DART_EXTERN_C
|
||||
#endif
|
||||
#else
|
||||
#if __GNUC__ >= 4
|
||||
#if defined(DART_SHARED_LIB)
|
||||
#define DART_EXPORT_DL DART_EXTERN_C __attribute__((visibility("default")))
|
||||
#else
|
||||
#define DART_EXPORT_DL DART_EXTERN_C
|
||||
#endif
|
||||
#else
|
||||
#error Tool chain not supported.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define DART_API_DL_DECLARATIONS(name, R, A) \
|
||||
typedef R(*name##_Type) A; \
|
||||
DART_EXPORT_DL name##_Type name##_DL;
|
||||
|
||||
DART_API_ALL_DL_SYMBOLS(DART_API_DL_DECLARATIONS)
|
||||
|
||||
#undef DART_API_DL_DECLARATIONS
|
||||
|
||||
#undef DART_EXPORT_DL
|
||||
|
||||
#endif /* RUNTIME_INCLUDE_DART_API_DL_H_ */ /* NOLINT */
|
||||
197
pedometer/src/dart-sdk/include/dart_native_api.h
Normal file
197
pedometer/src/dart-sdk/include/dart_native_api.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
||||
* for details. All rights reserved. Use of this source code is governed by a
|
||||
* BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef RUNTIME_INCLUDE_DART_NATIVE_API_H_
|
||||
#define RUNTIME_INCLUDE_DART_NATIVE_API_H_
|
||||
|
||||
#include "dart_api.h" /* NOLINT */
|
||||
|
||||
/*
|
||||
* ==========================================
|
||||
* Message sending/receiving from native code
|
||||
* ==========================================
|
||||
*/
|
||||
|
||||
/**
|
||||
* A Dart_CObject is used for representing Dart objects as native C
|
||||
* data outside the Dart heap. These objects are totally detached from
|
||||
* the Dart heap. Only a subset of the Dart objects have a
|
||||
* representation as a Dart_CObject.
|
||||
*
|
||||
* The string encoding in the 'value.as_string' is UTF-8.
|
||||
*
|
||||
* All the different types from dart:typed_data are exposed as type
|
||||
* kTypedData. The specific type from dart:typed_data is in the type
|
||||
* field of the as_typed_data structure. The length in the
|
||||
* as_typed_data structure is always in bytes.
|
||||
*
|
||||
* The data for kTypedData is copied on message send and ownership remains with
|
||||
* the caller. The ownership of data for kExternalTyped is passed to the VM on
|
||||
* message send and returned when the VM invokes the
|
||||
* Dart_HandleFinalizer callback; a non-NULL callback must be provided.
|
||||
*/
|
||||
typedef enum {
|
||||
Dart_CObject_kNull = 0,
|
||||
Dart_CObject_kBool,
|
||||
Dart_CObject_kInt32,
|
||||
Dart_CObject_kInt64,
|
||||
Dart_CObject_kDouble,
|
||||
Dart_CObject_kString,
|
||||
Dart_CObject_kArray,
|
||||
Dart_CObject_kTypedData,
|
||||
Dart_CObject_kExternalTypedData,
|
||||
Dart_CObject_kSendPort,
|
||||
Dart_CObject_kCapability,
|
||||
Dart_CObject_kNativePointer,
|
||||
Dart_CObject_kUnsupported,
|
||||
Dart_CObject_kNumberOfTypes
|
||||
} Dart_CObject_Type;
|
||||
|
||||
typedef struct _Dart_CObject {
|
||||
Dart_CObject_Type type;
|
||||
union {
|
||||
bool as_bool;
|
||||
int32_t as_int32;
|
||||
int64_t as_int64;
|
||||
double as_double;
|
||||
char* as_string;
|
||||
struct {
|
||||
Dart_Port id;
|
||||
Dart_Port origin_id;
|
||||
} as_send_port;
|
||||
struct {
|
||||
int64_t id;
|
||||
} as_capability;
|
||||
struct {
|
||||
intptr_t length;
|
||||
struct _Dart_CObject** values;
|
||||
} as_array;
|
||||
struct {
|
||||
Dart_TypedData_Type type;
|
||||
intptr_t length; /* in elements, not bytes */
|
||||
uint8_t* values;
|
||||
} as_typed_data;
|
||||
struct {
|
||||
Dart_TypedData_Type type;
|
||||
intptr_t length; /* in elements, not bytes */
|
||||
uint8_t* data;
|
||||
void* peer;
|
||||
Dart_HandleFinalizer callback;
|
||||
} as_external_typed_data;
|
||||
struct {
|
||||
intptr_t ptr;
|
||||
intptr_t size;
|
||||
Dart_HandleFinalizer callback;
|
||||
} as_native_pointer;
|
||||
} value;
|
||||
} Dart_CObject;
|
||||
// This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when
|
||||
// changing this struct.
|
||||
|
||||
/**
|
||||
* Posts a message on some port. The message will contain the Dart_CObject
|
||||
* object graph rooted in 'message'.
|
||||
*
|
||||
* While the message is being sent the state of the graph of Dart_CObject
|
||||
* structures rooted in 'message' should not be accessed, as the message
|
||||
* generation will make temporary modifications to the data. When the message
|
||||
* has been sent the graph will be fully restored.
|
||||
*
|
||||
* If true is returned, the message was enqueued, and finalizers for external
|
||||
* typed data will eventually run, even if the receiving isolate shuts down
|
||||
* before processing the message. If false is returned, the message was not
|
||||
* enqueued and ownership of external typed data in the message remains with the
|
||||
* caller.
|
||||
*
|
||||
* This function may be called on any thread when the VM is running (that is,
|
||||
* after Dart_Initialize has returned and before Dart_Cleanup has been called).
|
||||
*
|
||||
* \param port_id The destination port.
|
||||
* \param message The message to send.
|
||||
*
|
||||
* \return True if the message was posted.
|
||||
*/
|
||||
DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message);
|
||||
|
||||
/**
|
||||
* Posts a message on some port. The message will contain the integer 'message'.
|
||||
*
|
||||
* \param port_id The destination port.
|
||||
* \param message The message to send.
|
||||
*
|
||||
* \return True if the message was posted.
|
||||
*/
|
||||
DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message);
|
||||
|
||||
/**
|
||||
* A native message handler.
|
||||
*
|
||||
* This handler is associated with a native port by calling
|
||||
* Dart_NewNativePort.
|
||||
*
|
||||
* The message received is decoded into the message structure. The
|
||||
* lifetime of the message data is controlled by the caller. All the
|
||||
* data references from the message are allocated by the caller and
|
||||
* will be reclaimed when returning to it.
|
||||
*/
|
||||
typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
|
||||
Dart_CObject* message);
|
||||
|
||||
/**
|
||||
* Creates a new native port. When messages are received on this
|
||||
* native port, then they will be dispatched to the provided native
|
||||
* message handler.
|
||||
*
|
||||
* \param name The name of this port in debugging messages.
|
||||
* \param handler The C handler to run when messages arrive on the port.
|
||||
* \param handle_concurrently Is it okay to process requests on this
|
||||
* native port concurrently?
|
||||
*
|
||||
* \return If successful, returns the port id for the native port. In
|
||||
* case of error, returns ILLEGAL_PORT.
|
||||
*/
|
||||
DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
|
||||
Dart_NativeMessageHandler handler,
|
||||
bool handle_concurrently);
|
||||
/* TODO(turnidge): Currently handle_concurrently is ignored. */
|
||||
|
||||
/**
|
||||
* Closes the native port with the given id.
|
||||
*
|
||||
* The port must have been allocated by a call to Dart_NewNativePort.
|
||||
*
|
||||
* \param native_port_id The id of the native port to close.
|
||||
*
|
||||
* \return Returns true if the port was closed successfully.
|
||||
*/
|
||||
DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id);
|
||||
|
||||
/*
|
||||
* ==================
|
||||
* Verification Tools
|
||||
* ==================
|
||||
*/
|
||||
|
||||
/**
|
||||
* Forces all loaded classes and functions to be compiled eagerly in
|
||||
* the current isolate..
|
||||
*
|
||||
* TODO(turnidge): Document.
|
||||
*/
|
||||
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
|
||||
|
||||
/**
|
||||
* Finalizes all classes.
|
||||
*/
|
||||
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses();
|
||||
|
||||
/* This function is intentionally undocumented.
|
||||
*
|
||||
* It should not be used outside internal tests.
|
||||
*/
|
||||
DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg);
|
||||
|
||||
#endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
|
||||
526
pedometer/src/dart-sdk/include/dart_tools_api.h
Normal file
526
pedometer/src/dart-sdk/include/dart_tools_api.h
Normal file
@@ -0,0 +1,526 @@
|
||||
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#ifndef RUNTIME_INCLUDE_DART_TOOLS_API_H_
|
||||
#define RUNTIME_INCLUDE_DART_TOOLS_API_H_
|
||||
|
||||
#include "dart_api.h" /* NOLINT */
|
||||
|
||||
/** \mainpage Dart Tools Embedding API Reference
|
||||
*
|
||||
* This reference describes the Dart embedding API for tools. Tools include
|
||||
* a debugger, service protocol, and timeline.
|
||||
*
|
||||
* NOTE: The APIs described in this file are unstable and subject to change.
|
||||
*
|
||||
* This reference is generated from the header include/dart_tools_api.h.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ========
|
||||
* Debugger
|
||||
* ========
|
||||
*/
|
||||
|
||||
/**
|
||||
* ILLEGAL_ISOLATE_ID is a number guaranteed never to be associated with a
|
||||
* valid isolate.
|
||||
*/
|
||||
#define ILLEGAL_ISOLATE_ID ILLEGAL_PORT
|
||||
|
||||
|
||||
/*
|
||||
* =======
|
||||
* Service
|
||||
* =======
|
||||
*/
|
||||
|
||||
/**
|
||||
* A service request callback function.
|
||||
*
|
||||
* These callbacks, registered by the embedder, are called when the VM receives
|
||||
* a service request it can't handle and the service request command name
|
||||
* matches one of the embedder registered handlers.
|
||||
*
|
||||
* The return value of the callback indicates whether the response
|
||||
* should be used as a regular result or an error result.
|
||||
* Specifically, if the callback returns true, a regular JSON-RPC
|
||||
* response is built in the following way:
|
||||
*
|
||||
* {
|
||||
* "jsonrpc": "2.0",
|
||||
* "result": <json_object>,
|
||||
* "id": <some sequence id>,
|
||||
* }
|
||||
*
|
||||
* If the callback returns false, a JSON-RPC error is built like this:
|
||||
*
|
||||
* {
|
||||
* "jsonrpc": "2.0",
|
||||
* "error": <json_object>,
|
||||
* "id": <some sequence id>,
|
||||
* }
|
||||
*
|
||||
* \param method The rpc method name.
|
||||
* \param param_keys Service requests can have key-value pair parameters. The
|
||||
* keys and values are flattened and stored in arrays.
|
||||
* \param param_values The values associated with the keys.
|
||||
* \param num_params The length of the param_keys and param_values arrays.
|
||||
* \param user_data The user_data pointer registered with this handler.
|
||||
* \param result A C string containing a valid JSON object. The returned
|
||||
* pointer will be freed by the VM by calling free.
|
||||
*
|
||||
* \return True if the result is a regular JSON-RPC response, false if the
|
||||
* result is a JSON-RPC error.
|
||||
*/
|
||||
typedef bool (*Dart_ServiceRequestCallback)(const char* method,
|
||||
const char** param_keys,
|
||||
const char** param_values,
|
||||
intptr_t num_params,
|
||||
void* user_data,
|
||||
const char** json_object);
|
||||
|
||||
/**
|
||||
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||
* requests for the named rpc on a specific isolate. The callback will
|
||||
* be invoked with the current isolate set to the request target.
|
||||
*
|
||||
* \param method The name of the method that this callback is responsible for.
|
||||
* \param callback The callback to invoke.
|
||||
* \param user_data The user data passed to the callback.
|
||||
*
|
||||
* NOTE: If multiple callbacks with the same name are registered, only
|
||||
* the last callback registered will be remembered.
|
||||
*/
|
||||
DART_EXPORT void Dart_RegisterIsolateServiceRequestCallback(
|
||||
const char* method,
|
||||
Dart_ServiceRequestCallback callback,
|
||||
void* user_data);
|
||||
|
||||
/**
|
||||
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||
* requests for the named rpc. The callback will be invoked without a
|
||||
* current isolate.
|
||||
*
|
||||
* \param method The name of the command that this callback is responsible for.
|
||||
* \param callback The callback to invoke.
|
||||
* \param user_data The user data passed to the callback.
|
||||
*
|
||||
* NOTE: If multiple callbacks with the same name are registered, only
|
||||
* the last callback registered will be remembered.
|
||||
*/
|
||||
DART_EXPORT void Dart_RegisterRootServiceRequestCallback(
|
||||
const char* method,
|
||||
Dart_ServiceRequestCallback callback,
|
||||
void* user_data);
|
||||
|
||||
/**
|
||||
* Embedder information which can be requested by the VM for internal or
|
||||
* reporting purposes.
|
||||
*
|
||||
* The pointers in this structure are not going to be cached or freed by the VM.
|
||||
*/
|
||||
|
||||
#define DART_EMBEDDER_INFORMATION_CURRENT_VERSION (0x00000001)
|
||||
|
||||
typedef struct {
|
||||
int32_t version;
|
||||
const char* name; // [optional] The name of the embedder
|
||||
int64_t current_rss; // [optional] the current RSS of the embedder
|
||||
int64_t max_rss; // [optional] the maximum RSS of the embedder
|
||||
} Dart_EmbedderInformation;
|
||||
|
||||
/**
|
||||
* Callback provided by the embedder that is used by the vm to request
|
||||
* information.
|
||||
*
|
||||
* \return Returns a pointer to a Dart_EmbedderInformation structure.
|
||||
* The embedder keeps the ownership of the structure and any field in it.
|
||||
* The embedder must ensure that the structure will remain valid until the
|
||||
* next invokation of the callback.
|
||||
*/
|
||||
typedef void (*Dart_EmbedderInformationCallback)(
|
||||
Dart_EmbedderInformation* info);
|
||||
|
||||
/**
|
||||
* Register a Dart_ServiceRequestCallback to be called to handle
|
||||
* requests for the named rpc. The callback will be invoked without a
|
||||
* current isolate.
|
||||
*
|
||||
* \param method The name of the command that this callback is responsible for.
|
||||
* \param callback The callback to invoke.
|
||||
* \param user_data The user data passed to the callback.
|
||||
*
|
||||
* NOTE: If multiple callbacks with the same name are registered, only
|
||||
* the last callback registered will be remembered.
|
||||
*/
|
||||
DART_EXPORT void Dart_SetEmbedderInformationCallback(
|
||||
Dart_EmbedderInformationCallback callback);
|
||||
|
||||
/**
|
||||
* Invoke a vm-service method and wait for its result.
|
||||
*
|
||||
* \param request_json The utf8-encoded json-rpc request.
|
||||
* \param request_json_length The length of the json-rpc request.
|
||||
*
|
||||
* \param response_json The returned utf8-encoded json response, must be
|
||||
* free()ed by caller.
|
||||
* \param response_json_length The length of the returned json response.
|
||||
* \param error An optional error, must be free()ed by caller.
|
||||
*
|
||||
* \return Whether the call was sucessfully performed.
|
||||
*
|
||||
* NOTE: This method does not need a current isolate and must not have the
|
||||
* vm-isolate being the current isolate. It must be called after
|
||||
* Dart_Initialize() and before Dart_Cleanup().
|
||||
*/
|
||||
DART_EXPORT bool Dart_InvokeVMServiceMethod(uint8_t* request_json,
|
||||
intptr_t request_json_length,
|
||||
uint8_t** response_json,
|
||||
intptr_t* response_json_length,
|
||||
char** error);
|
||||
|
||||
/*
|
||||
* ========
|
||||
* Event Streams
|
||||
* ========
|
||||
*/
|
||||
|
||||
/**
|
||||
* A callback invoked when the VM service gets a request to listen to
|
||||
* some stream.
|
||||
*
|
||||
* \return Returns true iff the embedder supports the named stream id.
|
||||
*/
|
||||
typedef bool (*Dart_ServiceStreamListenCallback)(const char* stream_id);
|
||||
|
||||
/**
|
||||
* A callback invoked when the VM service gets a request to cancel
|
||||
* some stream.
|
||||
*/
|
||||
typedef void (*Dart_ServiceStreamCancelCallback)(const char* stream_id);
|
||||
|
||||
/**
|
||||
* Adds VM service stream callbacks.
|
||||
*
|
||||
* \param listen_callback A function pointer to a listen callback function.
|
||||
* A listen callback function should not be already set when this function
|
||||
* is called. A NULL value removes the existing listen callback function
|
||||
* if any.
|
||||
*
|
||||
* \param cancel_callback A function pointer to a cancel callback function.
|
||||
* A cancel callback function should not be already set when this function
|
||||
* is called. A NULL value removes the existing cancel callback function
|
||||
* if any.
|
||||
*
|
||||
* \return Success if the callbacks were added. Otherwise, returns an
|
||||
* error handle.
|
||||
*/
|
||||
DART_EXPORT char* Dart_SetServiceStreamCallbacks(
|
||||
Dart_ServiceStreamListenCallback listen_callback,
|
||||
Dart_ServiceStreamCancelCallback cancel_callback);
|
||||
|
||||
/**
|
||||
* A callback invoked when the VM service receives an event.
|
||||
*/
|
||||
typedef void (*Dart_NativeStreamConsumer)(const uint8_t* event_json,
|
||||
intptr_t event_json_length);
|
||||
|
||||
/**
|
||||
* Sets the native VM service stream callbacks for a particular stream.
|
||||
* Note: The function may be called on multiple threads concurrently.
|
||||
*
|
||||
* \param consumer A function pointer to an event handler callback function.
|
||||
* A NULL value removes the existing listen callback function if any.
|
||||
*
|
||||
* \param stream_id The ID of the stream on which to set the callback.
|
||||
*/
|
||||
DART_EXPORT void Dart_SetNativeServiceStreamCallback(
|
||||
Dart_NativeStreamConsumer consumer,
|
||||
const char* stream_id);
|
||||
|
||||
/**
|
||||
* Sends a data event to clients of the VM Service.
|
||||
*
|
||||
* A data event is used to pass an array of bytes to subscribed VM
|
||||
* Service clients. For example, in the standalone embedder, this is
|
||||
* function used to provide WriteEvents on the Stdout and Stderr
|
||||
* streams.
|
||||
*
|
||||
* If the embedder passes in a stream id for which no client is
|
||||
* subscribed, then the event is ignored.
|
||||
*
|
||||
* \param stream_id The id of the stream on which to post the event.
|
||||
*
|
||||
* \param event_kind A string identifying what kind of event this is.
|
||||
* For example, 'WriteEvent'.
|
||||
*
|
||||
* \param bytes A pointer to an array of bytes.
|
||||
*
|
||||
* \param bytes_length The length of the byte array.
|
||||
*
|
||||
* \return NULL if the arguments are well formed. Otherwise, returns an
|
||||
* error string. The caller is responsible for freeing the error message.
|
||||
*/
|
||||
DART_EXPORT char* Dart_ServiceSendDataEvent(const char* stream_id,
|
||||
const char* event_kind,
|
||||
const uint8_t* bytes,
|
||||
intptr_t bytes_length);
|
||||
|
||||
/**
|
||||
* Usage statistics for a space/generation at a particular moment in time.
|
||||
*
|
||||
* \param used Amount of memory used, in bytes.
|
||||
*
|
||||
* \param capacity Memory capacity, in bytes.
|
||||
*
|
||||
* \param external External memory, in bytes.
|
||||
*
|
||||
* \param collections How many times the garbage collector has run in this
|
||||
* space.
|
||||
*
|
||||
* \param time Cumulative time spent collecting garbage in this space, in
|
||||
* seconds.
|
||||
*
|
||||
* \param avg_collection_period Average time between garbage collector running
|
||||
* in this space, in milliseconds.
|
||||
*/
|
||||
typedef struct {
|
||||
intptr_t used;
|
||||
intptr_t capacity;
|
||||
intptr_t external;
|
||||
intptr_t collections;
|
||||
double time;
|
||||
double avg_collection_period;
|
||||
} Dart_GCStats;
|
||||
|
||||
/**
|
||||
* A Garbage Collection event with memory usage statistics.
|
||||
*
|
||||
* \param type The event type. Static lifetime.
|
||||
*
|
||||
* \param reason The reason for the GC event. Static lifetime.
|
||||
*
|
||||
* \param new_space Data for New Space.
|
||||
*
|
||||
* \param old_space Data for Old Space.
|
||||
*/
|
||||
typedef struct {
|
||||
const char* type;
|
||||
const char* reason;
|
||||
const char* isolate_id;
|
||||
|
||||
Dart_GCStats new_space;
|
||||
Dart_GCStats old_space;
|
||||
} Dart_GCEvent;
|
||||
|
||||
/**
|
||||
* A callback invoked when the VM emits a GC event.
|
||||
*
|
||||
* \param event The GC event data. Pointer only valid for the duration of the
|
||||
* callback.
|
||||
*/
|
||||
typedef void (*Dart_GCEventCallback)(Dart_GCEvent* event);
|
||||
|
||||
/**
|
||||
* Sets the native GC event callback.
|
||||
*
|
||||
* \param callback A function pointer to an event handler callback function.
|
||||
* A NULL value removes the existing listen callback function if any.
|
||||
*/
|
||||
DART_EXPORT void Dart_SetGCEventCallback(Dart_GCEventCallback callback);
|
||||
|
||||
/*
|
||||
* ========
|
||||
* Reload support
|
||||
* ========
|
||||
*
|
||||
* These functions are used to implement reloading in the Dart VM.
|
||||
* This is an experimental feature, so embedders should be prepared
|
||||
* for these functions to change.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A callback which determines whether the file at some url has been
|
||||
* modified since some time. If the file cannot be found, true should
|
||||
* be returned.
|
||||
*/
|
||||
typedef bool (*Dart_FileModifiedCallback)(const char* url, int64_t since);
|
||||
|
||||
DART_EXPORT char* Dart_SetFileModifiedCallback(
|
||||
Dart_FileModifiedCallback file_modified_callback);
|
||||
|
||||
/**
|
||||
* Returns true if isolate is currently reloading.
|
||||
*/
|
||||
DART_EXPORT bool Dart_IsReloading();
|
||||
|
||||
/*
|
||||
* ========
|
||||
* Timeline
|
||||
* ========
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns a timestamp in microseconds. This timestamp is suitable for
|
||||
* passing into the timeline system, and uses the same monotonic clock
|
||||
* as dart:developer's Timeline.now.
|
||||
*
|
||||
* \return A timestamp that can be passed to the timeline system.
|
||||
*/
|
||||
DART_EXPORT int64_t Dart_TimelineGetMicros();
|
||||
|
||||
/**
|
||||
* Returns a raw timestamp in from the monotonic clock.
|
||||
*
|
||||
* \return A raw timestamp from the monotonic clock.
|
||||
*/
|
||||
DART_EXPORT int64_t Dart_TimelineGetTicks();
|
||||
|
||||
/**
|
||||
* Returns the frequency of the monotonic clock.
|
||||
*
|
||||
* \return The frequency of the monotonic clock.
|
||||
*/
|
||||
DART_EXPORT int64_t Dart_TimelineGetTicksFrequency();
|
||||
|
||||
typedef enum {
|
||||
Dart_Timeline_Event_Begin, // Phase = 'B'.
|
||||
Dart_Timeline_Event_End, // Phase = 'E'.
|
||||
Dart_Timeline_Event_Instant, // Phase = 'i'.
|
||||
Dart_Timeline_Event_Duration, // Phase = 'X'.
|
||||
Dart_Timeline_Event_Async_Begin, // Phase = 'b'.
|
||||
Dart_Timeline_Event_Async_End, // Phase = 'e'.
|
||||
Dart_Timeline_Event_Async_Instant, // Phase = 'n'.
|
||||
Dart_Timeline_Event_Counter, // Phase = 'C'.
|
||||
Dart_Timeline_Event_Flow_Begin, // Phase = 's'.
|
||||
Dart_Timeline_Event_Flow_Step, // Phase = 't'.
|
||||
Dart_Timeline_Event_Flow_End, // Phase = 'f'.
|
||||
} Dart_Timeline_Event_Type;
|
||||
|
||||
/**
|
||||
* Add a timeline event to the embedder stream.
|
||||
*
|
||||
* \param label The name of the event. Its lifetime must extend at least until
|
||||
* Dart_Cleanup.
|
||||
* \param timestamp0 The first timestamp of the event.
|
||||
* \param timestamp1_or_async_id The second timestamp of the event or
|
||||
* the async id.
|
||||
* \param argument_count The number of argument names and values.
|
||||
* \param argument_names An array of names of the arguments. The lifetime of the
|
||||
* names must extend at least until Dart_Cleanup. The array may be reclaimed
|
||||
* when this call returns.
|
||||
* \param argument_values An array of values of the arguments. The values and
|
||||
* the array may be reclaimed when this call returns.
|
||||
*/
|
||||
DART_EXPORT void Dart_TimelineEvent(const char* label,
|
||||
int64_t timestamp0,
|
||||
int64_t timestamp1_or_async_id,
|
||||
Dart_Timeline_Event_Type type,
|
||||
intptr_t argument_count,
|
||||
const char** argument_names,
|
||||
const char** argument_values);
|
||||
|
||||
/**
|
||||
* Associates a name with the current thread. This name will be used to name
|
||||
* threads in the timeline. Can only be called after a call to Dart_Initialize.
|
||||
*
|
||||
* \param name The name of the thread.
|
||||
*/
|
||||
DART_EXPORT void Dart_SetThreadName(const char* name);
|
||||
|
||||
/*
|
||||
* =======
|
||||
* Metrics
|
||||
* =======
|
||||
*/
|
||||
|
||||
/**
|
||||
* Return metrics gathered for the VM and individual isolates.
|
||||
*
|
||||
* NOTE: Non-heap metrics are not available in PRODUCT builds of Dart.
|
||||
* Calling the non-heap metric functions on a PRODUCT build might return invalid metrics.
|
||||
*/
|
||||
DART_EXPORT int64_t Dart_VMIsolateCountMetric(); // Counter
|
||||
DART_EXPORT int64_t Dart_VMCurrentRSSMetric(); // Byte
|
||||
DART_EXPORT int64_t Dart_VMPeakRSSMetric(); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapOldUsedMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapOldUsedMaxMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapOldCapacityMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapOldCapacityMaxMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapOldExternalMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapNewUsedMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapNewUsedMaxMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapNewCapacityMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapNewCapacityMaxMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapNewExternalMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapGlobalUsedMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateHeapGlobalUsedMaxMetric(Dart_Isolate isolate); // Byte
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateRunnableLatencyMetric(Dart_Isolate isolate); // Microsecond
|
||||
DART_EXPORT int64_t
|
||||
Dart_IsolateRunnableHeapSizeMetric(Dart_Isolate isolate); // Byte
|
||||
|
||||
/*
|
||||
* ========
|
||||
* UserTags
|
||||
* ========
|
||||
*/
|
||||
|
||||
/*
|
||||
* Gets the current isolate's currently set UserTag instance.
|
||||
*
|
||||
* \return The currently set UserTag instance.
|
||||
*/
|
||||
DART_EXPORT Dart_Handle Dart_GetCurrentUserTag();
|
||||
|
||||
/*
|
||||
* Gets the current isolate's default UserTag instance.
|
||||
*
|
||||
* \return The default UserTag with label 'Default'
|
||||
*/
|
||||
DART_EXPORT Dart_Handle Dart_GetDefaultUserTag();
|
||||
|
||||
/*
|
||||
* Creates a new UserTag instance.
|
||||
*
|
||||
* \param label The name of the new UserTag.
|
||||
*
|
||||
* \return The newly created UserTag instance or an error handle.
|
||||
*/
|
||||
DART_EXPORT Dart_Handle Dart_NewUserTag(const char* label);
|
||||
|
||||
/*
|
||||
* Updates the current isolate's UserTag to a new value.
|
||||
*
|
||||
* \param user_tag The UserTag to be set as the current UserTag.
|
||||
*
|
||||
* \return The previously set UserTag instance or an error handle.
|
||||
*/
|
||||
DART_EXPORT Dart_Handle Dart_SetCurrentUserTag(Dart_Handle user_tag);
|
||||
|
||||
/*
|
||||
* Returns the label of a given UserTag instance.
|
||||
*
|
||||
* \param user_tag The UserTag from which the label will be retrieved.
|
||||
*
|
||||
* \return The UserTag's label. NULL if the user_tag is invalid. The caller is
|
||||
* responsible for freeing the returned label.
|
||||
*/
|
||||
DART_EXPORT DART_WARN_UNUSED_RESULT char* Dart_GetUserTagLabel(
|
||||
Dart_Handle user_tag);
|
||||
|
||||
#endif // RUNTIME_INCLUDE_DART_TOOLS_API_H_
|
||||
16
pedometer/src/dart-sdk/include/dart_version.h
Normal file
16
pedometer/src/dart-sdk/include/dart_version.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
* for details. All rights reserved. Use of this source code is governed by a
|
||||
* BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef RUNTIME_INCLUDE_DART_VERSION_H_
|
||||
#define RUNTIME_INCLUDE_DART_VERSION_H_
|
||||
|
||||
// On breaking changes the major version is increased.
|
||||
// On backwards compatible changes the minor version is increased.
|
||||
// The versioning covers the symbols exposed in dart_api_dl.h
|
||||
#define DART_API_DL_MAJOR_VERSION 2
|
||||
#define DART_API_DL_MINOR_VERSION 0
|
||||
|
||||
#endif /* RUNTIME_INCLUDE_DART_VERSION_H_ */ /* NOLINT */
|
||||
21
pedometer/src/dart-sdk/include/internal/dart_api_dl_impl.h
Normal file
21
pedometer/src/dart-sdk/include/internal/dart_api_dl_impl.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
||||
* for details. All rights reserved. Use of this source code is governed by a
|
||||
* BSD-style license that can be found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#ifndef RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_
|
||||
#define RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_
|
||||
|
||||
typedef struct {
|
||||
const char* name;
|
||||
void (*function)();
|
||||
} DartApiEntry;
|
||||
|
||||
typedef struct {
|
||||
const int major;
|
||||
const int minor;
|
||||
const DartApiEntry* const functions;
|
||||
} DartApi;
|
||||
|
||||
#endif /* RUNTIME_INCLUDE_INTERNAL_DART_API_DL_IMPL_H_ */ /* NOLINT */
|
||||
15
pedometer/src/health_connect/.clang-format
Normal file
15
pedometer/src/health_connect/.clang-format
Normal file
@@ -0,0 +1,15 @@
|
||||
# From dart SDK: https://github.com/dart-lang/sdk/blob/main/.clang-format
|
||||
|
||||
# Defines the Chromium style for automatic reformatting.
|
||||
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
||||
BasedOnStyle: Chromium
|
||||
|
||||
# clang-format doesn't seem to do a good job of this for longer comments.
|
||||
ReflowComments: 'false'
|
||||
|
||||
# We have lots of these. Though we need to put them all in curly braces,
|
||||
# clang-format can't do that.
|
||||
AllowShortIfStatementsOnASingleLine: 'true'
|
||||
|
||||
# Put escaped newlines into the rightmost column.
|
||||
AlignEscapedNewlinesLeft: false
|
||||
32
pedometer/src/health_connect/CMakeLists.txt
Normal file
32
pedometer/src/health_connect/CMakeLists.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
# jni_native_build (Build with jni:setup. Do not delete this line.)
|
||||
|
||||
# The Flutter tooling requires that developers have CMake 3.10 or later
|
||||
# installed. You should not increase this version, as doing so will cause
|
||||
# the plugin to fail to compile for some customers of the plugin.
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(health_connect VERSION 0.0.1 LANGUAGES C)
|
||||
|
||||
add_library(health_connect SHARED
|
||||
"./health_connect.c"
|
||||
)
|
||||
|
||||
set_target_properties(health_connect PROPERTIES
|
||||
OUTPUT_NAME "health_connect"
|
||||
)
|
||||
|
||||
target_compile_definitions(health_connect PUBLIC DART_SHARED_LIB)
|
||||
|
||||
if(WIN32)
|
||||
set_target_properties(${TARGET_NAME} PROPERTIES
|
||||
LINK_FLAGS "/DELAYLOAD:jvm.dll")
|
||||
endif()
|
||||
|
||||
if (ANDROID)
|
||||
target_link_libraries(health_connect log)
|
||||
else()
|
||||
find_package(Java REQUIRED)
|
||||
find_package(JNI REQUIRED)
|
||||
include_directories(${JNI_INCLUDE_DIRS})
|
||||
target_link_libraries(health_connect ${JNI_LIBRARIES})
|
||||
endif()
|
||||
383
pedometer/src/health_connect/dartjni.h
Normal file
383
pedometer/src/health_connect/dartjni.h
Normal file
@@ -0,0 +1,383 @@
|
||||
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Note: include appropriate system jni.h as found by CMake, not third_party/jni.h.
|
||||
#include <jni.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if _WIN32
|
||||
#define FFI_PLUGIN_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define FFI_PLUGIN_EXPORT
|
||||
#endif
|
||||
|
||||
#if defined _WIN32
|
||||
#define thread_local __declspec(thread)
|
||||
#else
|
||||
#define thread_local __thread
|
||||
#endif
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#include <android/log.h>
|
||||
#endif
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#define __ENVP_CAST (JNIEnv**)
|
||||
#else
|
||||
#define __ENVP_CAST (void**)
|
||||
#endif
|
||||
|
||||
/// Locking functions for windows and pthread.
|
||||
|
||||
#if defined _WIN32
|
||||
#include <windows.h>
|
||||
|
||||
typedef CRITICAL_SECTION MutexLock;
|
||||
typedef CONDITION_VARIABLE ConditionVariable;
|
||||
|
||||
static inline void init_lock(MutexLock* lock) {
|
||||
InitializeCriticalSection(lock);
|
||||
}
|
||||
|
||||
static inline void acquire_lock(MutexLock* lock) {
|
||||
EnterCriticalSection(lock);
|
||||
}
|
||||
|
||||
static inline void release_lock(MutexLock* lock) {
|
||||
LeaveCriticalSection(lock);
|
||||
}
|
||||
|
||||
static inline void destroy_lock(MutexLock* lock) {
|
||||
DeleteCriticalSection(lock);
|
||||
}
|
||||
|
||||
static inline void init_cond(ConditionVariable* cond) {
|
||||
InitializeConditionVariable(cond);
|
||||
}
|
||||
|
||||
static inline void signal_cond(ConditionVariable* cond) {
|
||||
WakeConditionVariable(cond);
|
||||
}
|
||||
|
||||
static inline void wait_for(ConditionVariable* cond, MutexLock* lock) {
|
||||
SleepConditionVariableCS(cond, lock, INFINITE);
|
||||
}
|
||||
|
||||
static inline void destroy_cond(ConditionVariable* cond) {
|
||||
// Not available.
|
||||
}
|
||||
|
||||
static inline void free_mem(void* mem) {
|
||||
CoTaskMemFree(mem);
|
||||
}
|
||||
|
||||
#elif defined __APPLE__ || defined __LINUX__ || defined __ANDROID__ || \
|
||||
defined __GNUC__
|
||||
#include <pthread.h>
|
||||
|
||||
typedef pthread_mutex_t MutexLock;
|
||||
typedef pthread_cond_t ConditionVariable;
|
||||
|
||||
static inline void init_lock(MutexLock* lock) {
|
||||
pthread_mutex_init(lock, NULL);
|
||||
}
|
||||
|
||||
static inline void acquire_lock(MutexLock* lock) {
|
||||
pthread_mutex_lock(lock);
|
||||
}
|
||||
|
||||
static inline void release_lock(MutexLock* lock) {
|
||||
pthread_mutex_unlock(lock);
|
||||
}
|
||||
|
||||
static inline void destroy_lock(MutexLock* lock) {
|
||||
pthread_mutex_destroy(lock);
|
||||
}
|
||||
|
||||
static inline void init_cond(ConditionVariable* cond) {
|
||||
pthread_cond_init(cond, NULL);
|
||||
}
|
||||
|
||||
static inline void signal_cond(ConditionVariable* cond) {
|
||||
pthread_cond_signal(cond);
|
||||
}
|
||||
|
||||
static inline void wait_for(ConditionVariable* cond, MutexLock* lock) {
|
||||
pthread_cond_wait(cond, lock);
|
||||
}
|
||||
|
||||
static inline void destroy_cond(ConditionVariable* cond) {
|
||||
pthread_cond_destroy(cond);
|
||||
}
|
||||
|
||||
static inline void free_mem(void* mem) {
|
||||
free(mem);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#error "No locking/condition variable support; Possibly unsupported platform"
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct CallbackResult {
|
||||
MutexLock lock;
|
||||
ConditionVariable cond;
|
||||
int ready;
|
||||
jobject object;
|
||||
} CallbackResult;
|
||||
|
||||
typedef struct JniLocks {
|
||||
MutexLock classLoadingLock;
|
||||
} JniLocks;
|
||||
|
||||
/// Represents the error when dart-jni layer has already spawned singleton VM.
|
||||
#define DART_JNI_SINGLETON_EXISTS (-99);
|
||||
|
||||
/// Stores the global state of the JNI.
|
||||
typedef struct JniContext {
|
||||
JavaVM* jvm;
|
||||
jobject classLoader;
|
||||
jmethodID loadClassMethod;
|
||||
jobject currentActivity;
|
||||
jobject appContext;
|
||||
JniLocks locks;
|
||||
} JniContext;
|
||||
|
||||
// jniEnv for this thread, used by inline functions in this header,
|
||||
// therefore declared as extern.
|
||||
extern thread_local JNIEnv* jniEnv;
|
||||
|
||||
extern JniContext* jni;
|
||||
|
||||
/// Types used by JNI API to distinguish between primitive types.
|
||||
enum JniType {
|
||||
booleanType = 0,
|
||||
byteType = 1,
|
||||
shortType = 2,
|
||||
charType = 3,
|
||||
intType = 4,
|
||||
longType = 5,
|
||||
floatType = 6,
|
||||
doubleType = 7,
|
||||
objectType = 8,
|
||||
voidType = 9,
|
||||
};
|
||||
|
||||
/// Result type for use by JNI.
|
||||
///
|
||||
/// If [exception] is null, it means the result is valid.
|
||||
/// It's assumed that the caller knows the expected type in [result].
|
||||
typedef struct JniResult {
|
||||
jvalue value;
|
||||
jthrowable exception;
|
||||
} JniResult;
|
||||
|
||||
/// Similar to [JniResult] but for class lookups.
|
||||
typedef struct JniClassLookupResult {
|
||||
jclass value;
|
||||
jthrowable exception;
|
||||
} JniClassLookupResult;
|
||||
|
||||
/// Similar to [JniResult] but for method/field ID lookups.
|
||||
typedef struct JniPointerResult {
|
||||
const void* value;
|
||||
jthrowable exception;
|
||||
} JniPointerResult;
|
||||
|
||||
/// JniExceptionDetails holds 2 jstring objects, one is the result of
|
||||
/// calling `toString` on exception object, other is stack trace;
|
||||
typedef struct JniExceptionDetails {
|
||||
jstring message;
|
||||
jstring stacktrace;
|
||||
} JniExceptionDetails;
|
||||
|
||||
/// This struct contains functions which wrap method call / field access conveniently along with
|
||||
/// exception checking.
|
||||
///
|
||||
/// Flutter embedding checks for pending JNI exceptions before an FFI transition, which requires us
|
||||
/// to check for and clear the exception before returning to dart code, which requires these functions
|
||||
/// to return result types.
|
||||
typedef struct JniAccessorsStruct {
|
||||
JniClassLookupResult (*getClass)(char* internalName);
|
||||
JniPointerResult (*getFieldID)(jclass cls, char* fieldName, char* signature);
|
||||
JniPointerResult (*getStaticFieldID)(jclass cls,
|
||||
char* fieldName,
|
||||
char* signature);
|
||||
JniPointerResult (*getMethodID)(jclass cls,
|
||||
char* methodName,
|
||||
char* signature);
|
||||
JniPointerResult (*getStaticMethodID)(jclass cls,
|
||||
char* methodName,
|
||||
char* signature);
|
||||
JniResult (*newObject)(jclass cls, jmethodID ctor, jvalue* args);
|
||||
JniResult (*newPrimitiveArray)(jsize length, int type);
|
||||
JniResult (*newObjectArray)(jsize length,
|
||||
jclass elementClass,
|
||||
jobject initialElement);
|
||||
JniResult (*getArrayElement)(jarray array, int index, int type);
|
||||
JniResult (*callMethod)(jobject obj,
|
||||
jmethodID methodID,
|
||||
int callType,
|
||||
jvalue* args);
|
||||
JniResult (*callStaticMethod)(jclass cls,
|
||||
jmethodID methodID,
|
||||
int callType,
|
||||
jvalue* args);
|
||||
JniResult (*getField)(jobject obj, jfieldID fieldID, int callType);
|
||||
JniResult (*getStaticField)(jclass cls, jfieldID fieldID, int callType);
|
||||
JniExceptionDetails (*getExceptionDetails)(jthrowable exception);
|
||||
} JniAccessorsStruct;
|
||||
|
||||
FFI_PLUGIN_EXPORT JniAccessorsStruct* GetAccessors();
|
||||
|
||||
FFI_PLUGIN_EXPORT JavaVM* GetJavaVM(void);
|
||||
|
||||
FFI_PLUGIN_EXPORT JNIEnv* GetJniEnv(void);
|
||||
|
||||
/// Spawn a JVM with given arguments.
|
||||
///
|
||||
/// Returns JNI_OK on success, and one of the documented JNI error codes on
|
||||
/// failure. It returns DART_JNI_SINGLETON_EXISTS if an attempt to spawn multiple
|
||||
/// JVMs is made, even if the underlying API potentially supports multiple VMs.
|
||||
FFI_PLUGIN_EXPORT int SpawnJvm(JavaVMInitArgs* args);
|
||||
|
||||
/// Returns Application classLoader (on Android),
|
||||
/// which can be used to load application and platform classes.
|
||||
///
|
||||
/// On other platforms, NULL is returned.
|
||||
FFI_PLUGIN_EXPORT jobject GetClassLoader(void);
|
||||
|
||||
/// Returns application context on Android.
|
||||
///
|
||||
/// On other platforms, NULL is returned.
|
||||
FFI_PLUGIN_EXPORT jobject GetApplicationContext(void);
|
||||
|
||||
/// Returns current activity of the app on Android.
|
||||
FFI_PLUGIN_EXPORT jobject GetCurrentActivity(void);
|
||||
|
||||
static inline void attach_thread() {
|
||||
if (jniEnv == NULL) {
|
||||
(*jni->jvm)->AttachCurrentThread(jni->jvm, __ENVP_CAST & jniEnv, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/// Load class into [cls] using platform specific mechanism
|
||||
static inline void load_class_platform(jclass* cls, const char* name) {
|
||||
#ifdef __ANDROID__
|
||||
jstring className = (*jniEnv)->NewStringUTF(jniEnv, name);
|
||||
*cls = (*jniEnv)->CallObjectMethod(jniEnv, jni->classLoader,
|
||||
jni->loadClassMethod, className);
|
||||
(*jniEnv)->DeleteLocalRef(jniEnv, className);
|
||||
#else
|
||||
*cls = (*jniEnv)->FindClass(jniEnv, name);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void load_class_global_ref(jclass* cls, const char* name) {
|
||||
if (*cls == NULL) {
|
||||
jclass tmp = NULL;
|
||||
acquire_lock(&jni->locks.classLoadingLock);
|
||||
if (*cls == NULL) {
|
||||
load_class_platform(&tmp, name);
|
||||
if (!(*jniEnv)->ExceptionCheck(jniEnv)) {
|
||||
*cls = (*jniEnv)->NewGlobalRef(jniEnv, tmp);
|
||||
(*jniEnv)->DeleteLocalRef(jniEnv, tmp);
|
||||
}
|
||||
}
|
||||
release_lock(&jni->locks.classLoadingLock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void load_method(jclass cls,
|
||||
jmethodID* res,
|
||||
const char* name,
|
||||
const char* sig) {
|
||||
if (*res == NULL) {
|
||||
*res = (*jniEnv)->GetMethodID(jniEnv, cls, name, sig);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void load_static_method(jclass cls,
|
||||
jmethodID* res,
|
||||
const char* name,
|
||||
const char* sig) {
|
||||
if (*res == NULL) {
|
||||
*res = (*jniEnv)->GetStaticMethodID(jniEnv, cls, name, sig);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void load_field(jclass cls,
|
||||
jfieldID* res,
|
||||
const char* name,
|
||||
const char* sig) {
|
||||
if (*res == NULL) {
|
||||
*res = (*jniEnv)->GetFieldID(jniEnv, cls, name, sig);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void load_static_field(jclass cls,
|
||||
jfieldID* res,
|
||||
const char* name,
|
||||
const char* sig) {
|
||||
if (*res == NULL) {
|
||||
*res = (*jniEnv)->GetStaticFieldID(jniEnv, cls, name, sig);
|
||||
}
|
||||
}
|
||||
|
||||
static inline jobject to_global_ref(jobject ref) {
|
||||
jobject g = (*jniEnv)->NewGlobalRef(jniEnv, ref);
|
||||
(*jniEnv)->DeleteLocalRef(jniEnv, ref);
|
||||
return g;
|
||||
}
|
||||
|
||||
// These functions are useful for C+Dart bindings, and not required for pure dart bindings.
|
||||
|
||||
FFI_PLUGIN_EXPORT JniContext* GetJniContextPtr();
|
||||
|
||||
/// For use by jni_gen's generated code
|
||||
/// don't use these.
|
||||
|
||||
// these 2 fn ptr vars will be defined by generated code library
|
||||
extern JniContext* (*context_getter)(void);
|
||||
extern JNIEnv* (*env_getter)(void);
|
||||
|
||||
// this function will be exported by generated code library
|
||||
// it will set above 2 variables.
|
||||
FFI_PLUGIN_EXPORT void setJniGetters(struct JniContext* (*cg)(void),
|
||||
JNIEnv* (*eg)(void));
|
||||
|
||||
static inline void load_env() {
|
||||
if (jniEnv == NULL) {
|
||||
jni = context_getter();
|
||||
jniEnv = env_getter();
|
||||
}
|
||||
}
|
||||
|
||||
static inline jthrowable check_exception() {
|
||||
jthrowable exception = (*jniEnv)->ExceptionOccurred(jniEnv);
|
||||
if (exception != NULL) (*jniEnv)->ExceptionClear(jniEnv);
|
||||
if (exception == NULL) return NULL;
|
||||
return to_global_ref(exception);
|
||||
}
|
||||
|
||||
static inline JniResult to_global_ref_result(jobject ref) {
|
||||
JniResult result;
|
||||
result.exception = check_exception();
|
||||
if (result.exception == NULL) {
|
||||
result.value.l = to_global_ref(ref);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
17326
pedometer/src/health_connect/health_connect.c
Normal file
17326
pedometer/src/health_connect/health_connect.c
Normal file
File diff suppressed because it is too large
Load Diff
7
pedometer/src/pedometerHelper.h
Normal file
7
pedometer/src/pedometerHelper.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#import <CoreMotion/CoreMotion.h>
|
||||
#import <CoreMotion/CMPedometer.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// TODO(https://github.com/dart-lang/native/issues/835): Generate this wrapper
|
||||
// automatically.
|
||||
CMPedometerHandler wrapCallback(CMPedometerHandler callback);
|
||||
12
pedometer/src/pedometerHelper.m
Normal file
12
pedometer/src/pedometerHelper.m
Normal file
@@ -0,0 +1,12 @@
|
||||
#import "pedometerHelper.h"
|
||||
#import <CoreMotion/CoreMotion.h>
|
||||
#import <CoreMotion/CMPedometer.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// TODO(https://github.com/dart-lang/native/issues/835): Generate this wrapper
|
||||
// automatically.
|
||||
CMPedometerHandler wrapCallback(CMPedometerHandler callback) {
|
||||
return [^(CMPedometerData *data, NSError *error) {
|
||||
return callback([data retain], [error retain]);
|
||||
} copy];
|
||||
}
|
||||
Reference in New Issue
Block a user