@nitro-mlkit/pose-detection 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/NitroMLKitPose.podspec +34 -0
  3. package/README.md +57 -0
  4. package/android/CMakeLists.txt +12 -0
  5. package/android/build.gradle +77 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +9 -0
  8. package/android/src/main/kotlin/com/margelo/nitro/nitromlkit/pose/HybridPoseDetector.kt +93 -0
  9. package/android/src/main/kotlin/com/nitromlkit/pose/NitroMLKitPosePackage.kt +19 -0
  10. package/expo-module.config.json +9 -0
  11. package/ios/HybridPoseDetector.swift +146 -0
  12. package/nitro.json +16 -0
  13. package/nitrogen/generated/.gitattributes +1 -0
  14. package/nitrogen/generated/android/NitroMLKitPose+autolinking.cmake +81 -0
  15. package/nitrogen/generated/android/NitroMLKitPose+autolinking.gradle +27 -0
  16. package/nitrogen/generated/android/NitroMLKitPoseOnLoad.cpp +54 -0
  17. package/nitrogen/generated/android/NitroMLKitPoseOnLoad.hpp +34 -0
  18. package/nitrogen/generated/android/c++/JBatchPoseResult.hpp +91 -0
  19. package/nitrogen/generated/android/c++/JHybridPoseDetectorSpec.cpp +123 -0
  20. package/nitrogen/generated/android/c++/JHybridPoseDetectorSpec.hpp +65 -0
  21. package/nitrogen/generated/android/c++/JPoseLandmark.hpp +73 -0
  22. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/BatchPoseResult.kt +66 -0
  23. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/HybridPoseDetectorSpec.kt +63 -0
  24. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/NitroMLKitPoseOnLoad.kt +35 -0
  25. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/PoseLandmark.kt +71 -0
  26. package/nitrogen/generated/ios/NitroMLKitPose+autolinking.rb +62 -0
  27. package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Bridge.cpp +57 -0
  28. package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Bridge.hpp +219 -0
  29. package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Umbrella.hpp +53 -0
  30. package/nitrogen/generated/ios/NitroMLKitPoseAutolinking.mm +33 -0
  31. package/nitrogen/generated/ios/NitroMLKitPoseAutolinking.swift +26 -0
  32. package/nitrogen/generated/ios/c++/HybridPoseDetectorSpecSwift.cpp +11 -0
  33. package/nitrogen/generated/ios/c++/HybridPoseDetectorSpecSwift.hpp +106 -0
  34. package/nitrogen/generated/ios/swift/BatchPoseResult.swift +63 -0
  35. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  36. package/nitrogen/generated/ios/swift/Func_void_std__vector_BatchPoseResult_.swift +46 -0
  37. package/nitrogen/generated/ios/swift/Func_void_std__vector_PoseLandmark_.swift +46 -0
  38. package/nitrogen/generated/ios/swift/HybridPoseDetectorSpec.swift +57 -0
  39. package/nitrogen/generated/ios/swift/HybridPoseDetectorSpec_cxx.swift +188 -0
  40. package/nitrogen/generated/ios/swift/PoseLandmark.swift +49 -0
  41. package/nitrogen/generated/shared/c++/BatchPoseResult.hpp +99 -0
  42. package/nitrogen/generated/shared/c++/HybridPoseDetectorSpec.cpp +23 -0
  43. package/nitrogen/generated/shared/c++/HybridPoseDetectorSpec.hpp +71 -0
  44. package/nitrogen/generated/shared/c++/PoseLandmark.hpp +99 -0
  45. package/package.json +54 -0
  46. package/src/index.ts +18 -0
  47. package/src/specs/PoseDetector.nitro.ts +47 -0
@@ -0,0 +1,34 @@
1
+ ///
2
+ /// NitroMLKitPoseOnLoad.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include <jni.h>
9
+ #include <functional>
10
+ #include <NitroModules/NitroDefines.hpp>
11
+
12
+ namespace margelo::nitro::mlkit::pose {
13
+
14
+ [[deprecated("Use registerNatives() instead.")]]
15
+ int initialize(JavaVM* vm);
16
+
17
+ /**
18
+ * Register the native (C++) part of NitroMLKitPose, and autolinks all Hybrid Objects.
19
+ * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
20
+ * inside a `facebook::jni::initialize(vm, ...)` call.
21
+ * Example:
22
+ * ```cpp (cpp-adapter.cpp)
23
+ * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
24
+ * return facebook::jni::initialize(vm, []() {
25
+ * // register all NitroMLKitPose HybridObjects
26
+ * margelo::nitro::mlkit::pose::registerNatives();
27
+ * // any other custom registrations go here.
28
+ * });
29
+ * }
30
+ * ```
31
+ */
32
+ void registerAllNatives();
33
+
34
+ } // namespace margelo::nitro::mlkit::pose
@@ -0,0 +1,91 @@
1
+ ///
2
+ /// JBatchPoseResult.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "BatchPoseResult.hpp"
12
+
13
+ #include "JPoseLandmark.hpp"
14
+ #include "PoseLandmark.hpp"
15
+ #include <optional>
16
+ #include <string>
17
+ #include <vector>
18
+
19
+ namespace margelo::nitro::mlkit::pose {
20
+
21
+ using namespace facebook;
22
+
23
+ /**
24
+ * The C++ JNI bridge between the C++ struct "BatchPoseResult" and the Kotlin data class "BatchPoseResult".
25
+ */
26
+ struct JBatchPoseResult final: public jni::JavaClass<JBatchPoseResult> {
27
+ public:
28
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitromlkit/pose/BatchPoseResult;";
29
+
30
+ public:
31
+ /**
32
+ * Convert this Java/Kotlin-based struct to the C++ struct BatchPoseResult by copying all values to C++.
33
+ */
34
+ [[maybe_unused]]
35
+ [[nodiscard]]
36
+ BatchPoseResult toCpp() const {
37
+ static const auto clazz = javaClassStatic();
38
+ static const auto fieldIndex = clazz->getField<double>("index");
39
+ double index = this->getFieldValue(fieldIndex);
40
+ static const auto fieldLandmarks = clazz->getField<jni::JArrayClass<JPoseLandmark>>("landmarks");
41
+ jni::local_ref<jni::JArrayClass<JPoseLandmark>> landmarks = this->getFieldValue(fieldLandmarks);
42
+ static const auto fieldSuccess = clazz->getField<jboolean>("success");
43
+ jboolean success = this->getFieldValue(fieldSuccess);
44
+ static const auto fieldError = clazz->getField<jni::JString>("error");
45
+ jni::local_ref<jni::JString> error = this->getFieldValue(fieldError);
46
+ return BatchPoseResult(
47
+ index,
48
+ [&](auto&& __input) {
49
+ size_t __size = __input->size();
50
+ std::vector<PoseLandmark> __vector;
51
+ __vector.reserve(__size);
52
+ for (size_t __i = 0; __i < __size; __i++) {
53
+ auto __element = __input->getElement(__i);
54
+ __vector.push_back(__element->toCpp());
55
+ }
56
+ return __vector;
57
+ }(landmarks),
58
+ static_cast<bool>(success),
59
+ error != nullptr ? std::make_optional(error->toStdString()) : std::nullopt
60
+ );
61
+ }
62
+
63
+ public:
64
+ /**
65
+ * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
66
+ */
67
+ [[maybe_unused]]
68
+ static jni::local_ref<JBatchPoseResult::javaobject> fromCpp(const BatchPoseResult& value) {
69
+ using JSignature = JBatchPoseResult(double, jni::alias_ref<jni::JArrayClass<JPoseLandmark>>, jboolean, jni::alias_ref<jni::JString>);
70
+ static const auto clazz = javaClassStatic();
71
+ static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
72
+ return create(
73
+ clazz,
74
+ value.index,
75
+ [&](auto&& __input) {
76
+ size_t __size = __input.size();
77
+ jni::local_ref<jni::JArrayClass<JPoseLandmark>> __array = jni::JArrayClass<JPoseLandmark>::newArray(__size);
78
+ for (size_t __i = 0; __i < __size; __i++) {
79
+ const auto& __element = __input[__i];
80
+ auto __elementJni = JPoseLandmark::fromCpp(__element);
81
+ __array->setElement(__i, *__elementJni);
82
+ }
83
+ return __array;
84
+ }(value.landmarks),
85
+ value.success,
86
+ value.error.has_value() ? jni::make_jstring(value.error.value()) : nullptr
87
+ );
88
+ }
89
+ };
90
+
91
+ } // namespace margelo::nitro::mlkit::pose
@@ -0,0 +1,123 @@
1
+ ///
2
+ /// JHybridPoseDetectorSpec.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include "JHybridPoseDetectorSpec.hpp"
9
+
10
+ // Forward declaration of `PoseLandmark` to properly resolve imports.
11
+ namespace margelo::nitro::mlkit::pose { struct PoseLandmark; }
12
+ // Forward declaration of `BatchPoseResult` to properly resolve imports.
13
+ namespace margelo::nitro::mlkit::pose { struct BatchPoseResult; }
14
+
15
+ #include "PoseLandmark.hpp"
16
+ #include <vector>
17
+ #include <NitroModules/Promise.hpp>
18
+ #include <NitroModules/JPromise.hpp>
19
+ #include "JPoseLandmark.hpp"
20
+ #include "BatchPoseResult.hpp"
21
+ #include "JBatchPoseResult.hpp"
22
+ #include <string>
23
+ #include <optional>
24
+
25
+ namespace margelo::nitro::mlkit::pose {
26
+
27
+ std::shared_ptr<JHybridPoseDetectorSpec> JHybridPoseDetectorSpec::JavaPart::getJHybridPoseDetectorSpec() {
28
+ auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
29
+ auto castHybridObject = std::dynamic_pointer_cast<JHybridPoseDetectorSpec>(hybridObject);
30
+ if (castHybridObject == nullptr) [[unlikely]] {
31
+ throw std::runtime_error("Failed to downcast JHybridObject to JHybridPoseDetectorSpec!");
32
+ }
33
+ return castHybridObject;
34
+ }
35
+
36
+ jni::local_ref<JHybridPoseDetectorSpec::CxxPart::jhybriddata> JHybridPoseDetectorSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
37
+ return makeCxxInstance(jThis);
38
+ }
39
+
40
+ std::shared_ptr<JHybridObject> JHybridPoseDetectorSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
41
+ auto castJavaPart = jni::dynamic_ref_cast<JHybridPoseDetectorSpec::JavaPart>(javaPart);
42
+ if (castJavaPart == nullptr) [[unlikely]] {
43
+ throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridPoseDetectorSpec::JavaPart!");
44
+ }
45
+ return std::make_shared<JHybridPoseDetectorSpec>(castJavaPart);
46
+ }
47
+
48
+ void JHybridPoseDetectorSpec::CxxPart::registerNatives() {
49
+ registerHybrid({
50
+ makeNativeMethod("initHybrid", JHybridPoseDetectorSpec::CxxPart::initHybrid),
51
+ });
52
+ }
53
+
54
+ // Properties
55
+
56
+
57
+ // Methods
58
+ std::shared_ptr<Promise<std::vector<PoseLandmark>>> JHybridPoseDetectorSpec::detect(const std::string& imageUri) {
59
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* imageUri */)>("detect");
60
+ auto __result = method(_javaPart, jni::make_jstring(imageUri));
61
+ return [&]() {
62
+ auto __promise = Promise<std::vector<PoseLandmark>>::create();
63
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
64
+ auto __result = jni::static_ref_cast<jni::JArrayClass<JPoseLandmark>>(__boxedResult);
65
+ __promise->resolve([&](auto&& __input) {
66
+ size_t __size = __input->size();
67
+ std::vector<PoseLandmark> __vector;
68
+ __vector.reserve(__size);
69
+ for (size_t __i = 0; __i < __size; __i++) {
70
+ auto __element = __input->getElement(__i);
71
+ __vector.push_back(__element->toCpp());
72
+ }
73
+ return __vector;
74
+ }(__result));
75
+ });
76
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
77
+ jni::JniException __jniError(__throwable);
78
+ __promise->reject(std::make_exception_ptr(__jniError));
79
+ });
80
+ return __promise;
81
+ }();
82
+ }
83
+ std::shared_ptr<Promise<std::vector<BatchPoseResult>>> JHybridPoseDetectorSpec::detectBatch(const std::vector<std::string>& imageUris, double concurrency) {
84
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JArrayClass<jni::JString>> /* imageUris */, double /* concurrency */)>("detectBatch");
85
+ auto __result = method(_javaPart, [&](auto&& __input) {
86
+ size_t __size = __input.size();
87
+ jni::local_ref<jni::JArrayClass<jni::JString>> __array = jni::JArrayClass<jni::JString>::newArray(__size);
88
+ for (size_t __i = 0; __i < __size; __i++) {
89
+ const auto& __element = __input[__i];
90
+ auto __elementJni = jni::make_jstring(__element);
91
+ __array->setElement(__i, *__elementJni);
92
+ }
93
+ return __array;
94
+ }(imageUris), concurrency);
95
+ return [&]() {
96
+ auto __promise = Promise<std::vector<BatchPoseResult>>::create();
97
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
98
+ auto __result = jni::static_ref_cast<jni::JArrayClass<JBatchPoseResult>>(__boxedResult);
99
+ __promise->resolve([&](auto&& __input) {
100
+ size_t __size = __input->size();
101
+ std::vector<BatchPoseResult> __vector;
102
+ __vector.reserve(__size);
103
+ for (size_t __i = 0; __i < __size; __i++) {
104
+ auto __element = __input->getElement(__i);
105
+ __vector.push_back(__element->toCpp());
106
+ }
107
+ return __vector;
108
+ }(__result));
109
+ });
110
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
111
+ jni::JniException __jniError(__throwable);
112
+ __promise->reject(std::make_exception_ptr(__jniError));
113
+ });
114
+ return __promise;
115
+ }();
116
+ }
117
+ bool JHybridPoseDetectorSpec::isAvailable() {
118
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isAvailable");
119
+ auto __result = method(_javaPart);
120
+ return static_cast<bool>(__result);
121
+ }
122
+
123
+ } // namespace margelo::nitro::mlkit::pose
@@ -0,0 +1,65 @@
1
+ ///
2
+ /// HybridPoseDetectorSpec.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <NitroModules/JHybridObject.hpp>
11
+ #include <fbjni/fbjni.h>
12
+ #include "HybridPoseDetectorSpec.hpp"
13
+
14
+
15
+
16
+
17
+ namespace margelo::nitro::mlkit::pose {
18
+
19
+ using namespace facebook;
20
+
21
+ class JHybridPoseDetectorSpec: public virtual HybridPoseDetectorSpec, public virtual JHybridObject {
22
+ public:
23
+ struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
24
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitromlkit/pose/HybridPoseDetectorSpec;";
25
+ std::shared_ptr<JHybridPoseDetectorSpec> getJHybridPoseDetectorSpec();
26
+ };
27
+ struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
28
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitromlkit/pose/HybridPoseDetectorSpec$CxxPart;";
29
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
30
+ static void registerNatives();
31
+ using HybridBase::HybridBase;
32
+ protected:
33
+ std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
34
+ };
35
+
36
+ public:
37
+ explicit JHybridPoseDetectorSpec(const jni::local_ref<JHybridPoseDetectorSpec::JavaPart>& javaPart):
38
+ HybridObject(HybridPoseDetectorSpec::TAG),
39
+ JHybridObject(javaPart),
40
+ _javaPart(jni::make_global(javaPart)) {}
41
+ ~JHybridPoseDetectorSpec() override {
42
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
43
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
44
+ }
45
+
46
+ public:
47
+ inline const jni::global_ref<JHybridPoseDetectorSpec::JavaPart>& getJavaPart() const noexcept {
48
+ return _javaPart;
49
+ }
50
+
51
+ public:
52
+ // Properties
53
+
54
+
55
+ public:
56
+ // Methods
57
+ std::shared_ptr<Promise<std::vector<PoseLandmark>>> detect(const std::string& imageUri) override;
58
+ std::shared_ptr<Promise<std::vector<BatchPoseResult>>> detectBatch(const std::vector<std::string>& imageUris, double concurrency) override;
59
+ bool isAvailable() override;
60
+
61
+ private:
62
+ jni::global_ref<JHybridPoseDetectorSpec::JavaPart> _javaPart;
63
+ };
64
+
65
+ } // namespace margelo::nitro::mlkit::pose
@@ -0,0 +1,73 @@
1
+ ///
2
+ /// JPoseLandmark.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "PoseLandmark.hpp"
12
+
13
+
14
+
15
+ namespace margelo::nitro::mlkit::pose {
16
+
17
+ using namespace facebook;
18
+
19
+ /**
20
+ * The C++ JNI bridge between the C++ struct "PoseLandmark" and the Kotlin data class "PoseLandmark".
21
+ */
22
+ struct JPoseLandmark final: public jni::JavaClass<JPoseLandmark> {
23
+ public:
24
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitromlkit/pose/PoseLandmark;";
25
+
26
+ public:
27
+ /**
28
+ * Convert this Java/Kotlin-based struct to the C++ struct PoseLandmark by copying all values to C++.
29
+ */
30
+ [[maybe_unused]]
31
+ [[nodiscard]]
32
+ PoseLandmark toCpp() const {
33
+ static const auto clazz = javaClassStatic();
34
+ static const auto fieldType = clazz->getField<double>("type");
35
+ double type = this->getFieldValue(fieldType);
36
+ static const auto fieldX = clazz->getField<double>("x");
37
+ double x = this->getFieldValue(fieldX);
38
+ static const auto fieldY = clazz->getField<double>("y");
39
+ double y = this->getFieldValue(fieldY);
40
+ static const auto fieldZ = clazz->getField<double>("z");
41
+ double z = this->getFieldValue(fieldZ);
42
+ static const auto fieldInFrameLikelihood = clazz->getField<double>("inFrameLikelihood");
43
+ double inFrameLikelihood = this->getFieldValue(fieldInFrameLikelihood);
44
+ return PoseLandmark(
45
+ type,
46
+ x,
47
+ y,
48
+ z,
49
+ inFrameLikelihood
50
+ );
51
+ }
52
+
53
+ public:
54
+ /**
55
+ * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
56
+ */
57
+ [[maybe_unused]]
58
+ static jni::local_ref<JPoseLandmark::javaobject> fromCpp(const PoseLandmark& value) {
59
+ using JSignature = JPoseLandmark(double, double, double, double, double);
60
+ static const auto clazz = javaClassStatic();
61
+ static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
62
+ return create(
63
+ clazz,
64
+ value.type,
65
+ value.x,
66
+ value.y,
67
+ value.z,
68
+ value.inFrameLikelihood
69
+ );
70
+ }
71
+ };
72
+
73
+ } // namespace margelo::nitro::mlkit::pose
@@ -0,0 +1,66 @@
1
+ ///
2
+ /// BatchPoseResult.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.nitromlkit.pose
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.proguard.annotations.DoNotStrip
12
+ import java.util.Objects
13
+
14
+
15
+ /**
16
+ * Represents the JavaScript object/struct "BatchPoseResult".
17
+ */
18
+ @DoNotStrip
19
+ @Keep
20
+ data class BatchPoseResult(
21
+ @DoNotStrip
22
+ @Keep
23
+ val index: Double,
24
+ @DoNotStrip
25
+ @Keep
26
+ val landmarks: Array<PoseLandmark>,
27
+ @DoNotStrip
28
+ @Keep
29
+ val success: Boolean,
30
+ @DoNotStrip
31
+ @Keep
32
+ val error: String?
33
+ ) {
34
+ /* primary constructor */
35
+
36
+ override fun equals(other: Any?): Boolean {
37
+ if (this === other) return true
38
+ if (other !is BatchPoseResult) return false
39
+ return Objects.deepEquals(this.index, other.index)
40
+ && Objects.deepEquals(this.landmarks, other.landmarks)
41
+ && Objects.deepEquals(this.success, other.success)
42
+ && Objects.deepEquals(this.error, other.error)
43
+ }
44
+
45
+ override fun hashCode(): Int {
46
+ return arrayOf<Any?>(
47
+ index,
48
+ landmarks,
49
+ success,
50
+ error
51
+ ).contentDeepHashCode()
52
+ }
53
+
54
+ companion object {
55
+ /**
56
+ * Constructor called from C++
57
+ */
58
+ @DoNotStrip
59
+ @Keep
60
+ @Suppress("unused")
61
+ @JvmStatic
62
+ private fun fromCpp(index: Double, landmarks: Array<PoseLandmark>, success: Boolean, error: String?): BatchPoseResult {
63
+ return BatchPoseResult(index, landmarks, success, error)
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,63 @@
1
+ ///
2
+ /// HybridPoseDetectorSpec.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.nitromlkit.pose
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.jni.HybridData
12
+ import com.facebook.proguard.annotations.DoNotStrip
13
+ import com.margelo.nitro.core.Promise
14
+ import com.margelo.nitro.core.HybridObject
15
+
16
+ /**
17
+ * A Kotlin class representing the PoseDetector HybridObject.
18
+ * Implement this abstract class to create Kotlin-based instances of PoseDetector.
19
+ */
20
+ @DoNotStrip
21
+ @Keep
22
+ @Suppress(
23
+ "KotlinJniMissingFunction", "unused",
24
+ "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
25
+ "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
26
+ )
27
+ abstract class HybridPoseDetectorSpec: HybridObject() {
28
+ // Properties
29
+
30
+
31
+ // Methods
32
+ @DoNotStrip
33
+ @Keep
34
+ abstract fun detect(imageUri: String): Promise<Array<PoseLandmark>>
35
+
36
+ @DoNotStrip
37
+ @Keep
38
+ abstract fun detectBatch(imageUris: Array<String>, concurrency: Double): Promise<Array<BatchPoseResult>>
39
+
40
+ @DoNotStrip
41
+ @Keep
42
+ abstract fun isAvailable(): Boolean
43
+
44
+ // Default implementation of `HybridObject.toString()`
45
+ override fun toString(): String {
46
+ return "[HybridObject PoseDetector]"
47
+ }
48
+
49
+ // C++ backing class
50
+ @DoNotStrip
51
+ @Keep
52
+ protected open class CxxPart(javaPart: HybridPoseDetectorSpec): HybridObject.CxxPart(javaPart) {
53
+ // C++ JHybridPoseDetectorSpec::CxxPart::initHybrid(...)
54
+ external override fun initHybrid(): HybridData
55
+ }
56
+ override fun createCxxPart(): CxxPart {
57
+ return CxxPart(this)
58
+ }
59
+
60
+ companion object {
61
+ protected const val TAG = "HybridPoseDetectorSpec"
62
+ }
63
+ }
@@ -0,0 +1,35 @@
1
+ ///
2
+ /// NitroMLKitPoseOnLoad.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.nitromlkit.pose
9
+
10
+ import android.util.Log
11
+
12
+ internal class NitroMLKitPoseOnLoad {
13
+ companion object {
14
+ private const val TAG = "NitroMLKitPoseOnLoad"
15
+ private var didLoad = false
16
+ /**
17
+ * Initializes the native part of "NitroMLKitPose".
18
+ * This method is idempotent and can be called more than once.
19
+ */
20
+ @JvmStatic
21
+ fun initializeNative() {
22
+ if (didLoad) return
23
+ try {
24
+ Log.i(TAG, "Loading NitroMLKitPose C++ library...")
25
+ System.loadLibrary("NitroMLKitPose")
26
+ Log.i(TAG, "Successfully loaded NitroMLKitPose C++ library!")
27
+ didLoad = true
28
+ } catch (e: Error) {
29
+ Log.e(TAG, "Failed to load NitroMLKitPose C++ library! Is it properly installed and linked? " +
30
+ "Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e)
31
+ throw e
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,71 @@
1
+ ///
2
+ /// PoseLandmark.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.nitromlkit.pose
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.proguard.annotations.DoNotStrip
12
+ import java.util.Objects
13
+
14
+
15
+ /**
16
+ * Represents the JavaScript object/struct "PoseLandmark".
17
+ */
18
+ @DoNotStrip
19
+ @Keep
20
+ data class PoseLandmark(
21
+ @DoNotStrip
22
+ @Keep
23
+ val type: Double,
24
+ @DoNotStrip
25
+ @Keep
26
+ val x: Double,
27
+ @DoNotStrip
28
+ @Keep
29
+ val y: Double,
30
+ @DoNotStrip
31
+ @Keep
32
+ val z: Double,
33
+ @DoNotStrip
34
+ @Keep
35
+ val inFrameLikelihood: Double
36
+ ) {
37
+ /* primary constructor */
38
+
39
+ override fun equals(other: Any?): Boolean {
40
+ if (this === other) return true
41
+ if (other !is PoseLandmark) return false
42
+ return Objects.deepEquals(this.type, other.type)
43
+ && Objects.deepEquals(this.x, other.x)
44
+ && Objects.deepEquals(this.y, other.y)
45
+ && Objects.deepEquals(this.z, other.z)
46
+ && Objects.deepEquals(this.inFrameLikelihood, other.inFrameLikelihood)
47
+ }
48
+
49
+ override fun hashCode(): Int {
50
+ return arrayOf<Any?>(
51
+ type,
52
+ x,
53
+ y,
54
+ z,
55
+ inFrameLikelihood
56
+ ).contentDeepHashCode()
57
+ }
58
+
59
+ companion object {
60
+ /**
61
+ * Constructor called from C++
62
+ */
63
+ @DoNotStrip
64
+ @Keep
65
+ @Suppress("unused")
66
+ @JvmStatic
67
+ private fun fromCpp(type: Double, x: Double, y: Double, z: Double, inFrameLikelihood: Double): PoseLandmark {
68
+ return PoseLandmark(type, x, y, z, inFrameLikelihood)
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,62 @@
1
+ #
2
+ # NitroMLKitPose+autolinking.rb
3
+ # This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ # https://github.com/mrousavy/nitro
5
+ # Copyright © Marc Rousavy @ Margelo
6
+ #
7
+
8
+ # This is a Ruby script that adds all files generated by Nitrogen
9
+ # to the given podspec.
10
+ #
11
+ # To use it, add this to your .podspec:
12
+ # ```ruby
13
+ # Pod::Spec.new do |spec|
14
+ # # ...
15
+ #
16
+ # # Add all files generated by Nitrogen
17
+ # load 'nitrogen/generated/ios/NitroMLKitPose+autolinking.rb'
18
+ # add_nitrogen_files(spec)
19
+ # end
20
+ # ```
21
+
22
+ def add_nitrogen_files(spec)
23
+ Pod::UI.puts "[NitroModules] 🔥 NitroMLKitPose is boosted by nitro!"
24
+
25
+ spec.dependency "NitroModules"
26
+
27
+ current_source_files = Array(spec.attributes_hash['source_files'])
28
+ spec.source_files = current_source_files + [
29
+ # Generated cross-platform specs
30
+ "nitrogen/generated/shared/**/*.{h,hpp,c,cpp,swift}",
31
+ # Generated bridges for the cross-platform specs
32
+ "nitrogen/generated/ios/**/*.{h,hpp,c,cpp,mm,swift}",
33
+ ]
34
+
35
+ current_public_header_files = Array(spec.attributes_hash['public_header_files'])
36
+ spec.public_header_files = current_public_header_files + [
37
+ # Generated specs
38
+ "nitrogen/generated/shared/**/*.{h,hpp}",
39
+ # Swift to C++ bridging helpers
40
+ "nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Bridge.hpp"
41
+ ]
42
+
43
+ current_private_header_files = Array(spec.attributes_hash['private_header_files'])
44
+ spec.private_header_files = current_private_header_files + [
45
+ # iOS specific specs
46
+ "nitrogen/generated/ios/c++/**/*.{h,hpp}",
47
+ # Views are framework-specific and should be private
48
+ "nitrogen/generated/shared/**/views/**/*"
49
+ ]
50
+
51
+ current_pod_target_xcconfig = spec.attributes_hash['pod_target_xcconfig'] || {}
52
+ spec.pod_target_xcconfig = current_pod_target_xcconfig.merge({
53
+ # Use C++ 20
54
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
55
+ # Enables C++ <-> Swift interop (by default it's only ObjC)
56
+ "SWIFT_OBJC_INTEROP_MODE" => "objcxx",
57
+ # Enables stricter modular headers
58
+ "DEFINES_MODULE" => "YES",
59
+ # Disable auto-generated ObjC header for Swift (Static linkage on Xcode 26.4 breaks here)
60
+ "SWIFT_INSTALL_OBJC_HEADER" => "NO",
61
+ })
62
+ end