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