@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.
- package/LICENSE +21 -0
- package/NitroMLKitPose.podspec +34 -0
- package/README.md +57 -0
- package/android/CMakeLists.txt +12 -0
- package/android/build.gradle +77 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/kotlin/com/margelo/nitro/nitromlkit/pose/HybridPoseDetector.kt +93 -0
- package/android/src/main/kotlin/com/nitromlkit/pose/NitroMLKitPosePackage.kt +19 -0
- package/expo-module.config.json +9 -0
- package/ios/HybridPoseDetector.swift +146 -0
- package/nitro.json +16 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroMLKitPose+autolinking.cmake +81 -0
- package/nitrogen/generated/android/NitroMLKitPose+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroMLKitPoseOnLoad.cpp +54 -0
- package/nitrogen/generated/android/NitroMLKitPoseOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JBatchPoseResult.hpp +91 -0
- package/nitrogen/generated/android/c++/JHybridPoseDetectorSpec.cpp +123 -0
- package/nitrogen/generated/android/c++/JHybridPoseDetectorSpec.hpp +65 -0
- package/nitrogen/generated/android/c++/JPoseLandmark.hpp +73 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/BatchPoseResult.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/HybridPoseDetectorSpec.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/NitroMLKitPoseOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/PoseLandmark.kt +71 -0
- package/nitrogen/generated/ios/NitroMLKitPose+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Bridge.cpp +57 -0
- package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Bridge.hpp +219 -0
- package/nitrogen/generated/ios/NitroMLKitPose-Swift-Cxx-Umbrella.hpp +53 -0
- package/nitrogen/generated/ios/NitroMLKitPoseAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroMLKitPoseAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridPoseDetectorSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridPoseDetectorSpecSwift.hpp +106 -0
- package/nitrogen/generated/ios/swift/BatchPoseResult.swift +63 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_BatchPoseResult_.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_PoseLandmark_.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridPoseDetectorSpec.swift +57 -0
- package/nitrogen/generated/ios/swift/HybridPoseDetectorSpec_cxx.swift +188 -0
- package/nitrogen/generated/ios/swift/PoseLandmark.swift +49 -0
- package/nitrogen/generated/shared/c++/BatchPoseResult.hpp +99 -0
- package/nitrogen/generated/shared/c++/HybridPoseDetectorSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridPoseDetectorSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/PoseLandmark.hpp +99 -0
- package/package.json +54 -0
- package/src/index.ts +18 -0
- 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
|
package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/BatchPoseResult.kt
ADDED
|
@@ -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
|
+
}
|
package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitromlkit/pose/NitroMLKitPoseOnLoad.kt
ADDED
|
@@ -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
|