1 #include "JavaScriptTypedArray.h"
2 
3 #include "JavaScriptRuntime.h"
4 #include "JSIInteropModuleRegistry.h"
5 
6 namespace expo {
7 
JavaScriptTypedArray(WeakRuntimeHolder runtime,std::shared_ptr<jsi::Object> jsObject)8 JavaScriptTypedArray::JavaScriptTypedArray(
9   WeakRuntimeHolder runtime,
10   std::shared_ptr<jsi::Object> jsObject
11 ) : jni::HybridClass<JavaScriptTypedArray, JavaScriptObject>(std::move(runtime),
12                                                              std::move(jsObject)) {
13   jsi::Runtime &jsRuntime = runtimeHolder.getJSRuntime();
14   typedArrayWrapper = std::make_shared<expo::TypedArray>(jsRuntime, *get());
15   rawPointer = static_cast<char *>(typedArrayWrapper->getRawPointer(jsRuntime));
16 }
17 
JavaScriptTypedArray(std::weak_ptr<JavaScriptRuntime> runtime,std::shared_ptr<jsi::Object> jsObject)18 JavaScriptTypedArray::JavaScriptTypedArray(
19   std::weak_ptr<JavaScriptRuntime> runtime,
20   std::shared_ptr<jsi::Object> jsObject
21 ) : jni::HybridClass<JavaScriptTypedArray, JavaScriptObject>(std::move(runtime),
22                                                              std::move(jsObject)) {
23   jsi::Runtime &jsRuntime = runtimeHolder.getJSRuntime();
24   typedArrayWrapper = std::make_shared<expo::TypedArray>(jsRuntime, *get());
25   rawPointer = static_cast<char *>(typedArrayWrapper->getRawPointer(jsRuntime));
26 }
27 
registerNatives()28 void JavaScriptTypedArray::registerNatives() {
29   registerHybrid({
30                    makeNativeMethod("getRawKind", JavaScriptTypedArray::getRawKind),
31                    makeNativeMethod("toDirectBuffer", JavaScriptTypedArray::toDirectBuffer),
32                    makeNativeMethod("read", JavaScriptTypedArray::readBuffer),
33                    makeNativeMethod("write", JavaScriptTypedArray::writeBuffer),
34 
35                    makeNativeMethod("readByte", JavaScriptTypedArray::read<int8_t>),
36                    makeNativeMethod("read2Byte", JavaScriptTypedArray::read<int16_t>),
37                    makeNativeMethod("read4Byte", JavaScriptTypedArray::read<int32_t>),
38                    makeNativeMethod("read8Byte", JavaScriptTypedArray::read<int64_t>),
39                    makeNativeMethod("readFloat", JavaScriptTypedArray::read<float>),
40                    makeNativeMethod("readDouble", JavaScriptTypedArray::read<double>),
41 
42                    makeNativeMethod("writeByte", JavaScriptTypedArray::write<int8_t>),
43                    makeNativeMethod("write2Byte", JavaScriptTypedArray::write<int16_t>),
44                    makeNativeMethod("write4Byte", JavaScriptTypedArray::write<int32_t>),
45                    makeNativeMethod("write8Byte", JavaScriptTypedArray::write<int64_t>),
46                    makeNativeMethod("writeFloat", JavaScriptTypedArray::write<float>),
47                    makeNativeMethod("writeDouble", JavaScriptTypedArray::write<double>),
48                  });
49 }
50 
getRawKind()51 int JavaScriptTypedArray::getRawKind() {
52   jsi::Runtime &jsRuntime = runtimeHolder.getJSRuntime();
53   return (int) typedArrayWrapper->getKind(jsRuntime);
54 }
55 
toDirectBuffer()56 jni::local_ref<jni::JByteBuffer> JavaScriptTypedArray::toDirectBuffer() {
57   jsi::Runtime &jsRuntime = runtimeHolder.getJSRuntime();
58 
59   auto byteLength = typedArrayWrapper->byteLength(jsRuntime);
60   auto byteOffset = typedArrayWrapper->byteOffset(jsRuntime);
61 
62   auto byteBuffer = jni::JByteBuffer::wrapBytes(
63     static_cast<uint8_t *>(typedArrayWrapper->getRawPointer(jsRuntime)),
64     byteLength - byteOffset
65   );
66 
67   byteBuffer->order(jni::JByteOrder::nativeOrder());
68 
69   return byteBuffer;
70 }
71 
readBuffer(jni::alias_ref<jni::JArrayByte> buffer,int position,int size)72 void JavaScriptTypedArray::readBuffer(
73   jni::alias_ref<jni::JArrayByte> buffer,
74   int position,
75   int size
76 ) {
77   buffer->setRegion(
78     0,
79     size,
80     reinterpret_cast<const signed char *>(rawPointer + position)
81   );
82 }
83 
writeBuffer(jni::alias_ref<jni::JArrayByte> buffer,int position,int size)84 void JavaScriptTypedArray::writeBuffer(
85   jni::alias_ref<jni::JArrayByte> buffer,
86   int position,
87   int size
88 ) {
89   auto region = buffer->getRegion(0, size);
90   memcpy(rawPointer + position, region.get(), size);
91 }
92 
newInstance(JSIInteropModuleRegistry * jsiInteropModuleRegistry,std::weak_ptr<JavaScriptRuntime> runtime,std::shared_ptr<jsi::Object> jsObject)93 jni::local_ref<JavaScriptTypedArray::javaobject> JavaScriptTypedArray::newInstance(
94   JSIInteropModuleRegistry *jsiInteropModuleRegistry,
95   std::weak_ptr<JavaScriptRuntime> runtime,
96   std::shared_ptr<jsi::Object> jsObject
97 ) {
98   auto object = JavaScriptTypedArray::newObjectCxxArgs(
99     std::move(runtime),
100     std::move(jsObject)
101   );
102   jsiInteropModuleRegistry->jniDeallocator->addReference(object);
103   return object;
104 }
105 }
106