Add utility method to create a DartByteData handle from an existing allocation.
\

Change-Id: I0a9d78b6a7fdae667a00d597d7701d3cc04e0c81
diff --git a/typed_data/dart_byte_data.cc b/typed_data/dart_byte_data.cc
index 81d3391..a3f3a52 100644
--- a/typed_data/dart_byte_data.cc
+++ b/typed_data/dart_byte_data.cc
@@ -8,9 +8,30 @@
 
 namespace tonic {
 
+Dart_Handle DartByteData::Create(const void* data, size_t length) {
+  auto handle = DartByteData{data, length}.dart_handle();
+  // The destructor should release the typed data.
+  return handle;
+}
+
 DartByteData::DartByteData()
     : data_(nullptr), length_in_bytes_(0), dart_handle_(nullptr) {}
 
+DartByteData::DartByteData(const void* data, size_t length)
+    : data_(nullptr),
+      length_in_bytes_(0),
+      dart_handle_(Dart_NewTypedData(Dart_TypedData_kByteData, length)) {
+  if (!Dart_IsError(dart_handle_)) {
+    Dart_TypedData_Type type;
+    auto acquire_result = Dart_TypedDataAcquireData(dart_handle_, &type, &data_,
+                                                    &length_in_bytes_);
+
+    if (!Dart_IsError(acquire_result)) {
+      ::memcpy(data_, data, length_in_bytes_);
+    }
+  }
+}
+
 DartByteData::DartByteData(Dart_Handle list)
     : data_(nullptr), length_in_bytes_(0), dart_handle_(list) {
   if (Dart_IsNull(list))
diff --git a/typed_data/dart_byte_data.h b/typed_data/dart_byte_data.h
index a4c10bc..aa2deba 100644
--- a/typed_data/dart_byte_data.h
+++ b/typed_data/dart_byte_data.h
@@ -14,6 +14,8 @@
 
 class DartByteData {
  public:
+  static Dart_Handle Create(const void* data, size_t length);
+
   explicit DartByteData(Dart_Handle list);
   DartByteData(DartByteData&& other);
   DartByteData();
@@ -35,6 +37,7 @@
   Dart_Handle dart_handle_;
 
   DartByteData(const DartByteData& other) = delete;
+  DartByteData(const void* data, size_t length);
 };
 
 template <>