diff --git a/mediapipe/java/com/google/mediapipe/framework/PacketCreator.java b/mediapipe/java/com/google/mediapipe/framework/PacketCreator.java index 47b1814be..536735f62 100644 --- a/mediapipe/java/com/google/mediapipe/framework/PacketCreator.java +++ b/mediapipe/java/com/google/mediapipe/framework/PacketCreator.java @@ -196,15 +196,15 @@ public class PacketCreator { } public Packet createInt16Vector(short[] data) { - throw new UnsupportedOperationException("Not implemented yet"); + return Packet.create(nativeCreateInt16Vector(mediapipeGraph.getNativeHandle(), data)); } public Packet createInt32Vector(int[] data) { - throw new UnsupportedOperationException("Not implemented yet"); + return Packet.create(nativeCreateInt32Vector(mediapipeGraph.getNativeHandle(), data)); } public Packet createInt64Vector(long[] data) { - throw new UnsupportedOperationException("Not implemented yet"); + return Packet.create(nativeCreateInt64Vector(mediapipeGraph.getNativeHandle(), data)); } public Packet createFloat32Vector(float[] data) { @@ -212,7 +212,7 @@ public class PacketCreator { } public Packet createFloat64Vector(double[] data) { - throw new UnsupportedOperationException("Not implemented yet"); + return Packet.create(nativeCreateFloat64Vector(mediapipeGraph.getNativeHandle(), data)); } public Packet createInt32Array(int[] data) { @@ -367,7 +367,11 @@ public class PacketCreator { private native long nativeCreateInt32Array(long context, int[] data); private native long nativeCreateFloat32Array(long context, float[] data); + private native long nativeCreateInt16Vector(long context, short[] data); + private native long nativeCreateInt32Vector(long context, int[] data); + private native long nativeCreateInt64Vector(long context, long[] data); private native long nativeCreateFloat32Vector(long context, float[] data); + private native long nativeCreateFloat64Vector(long context, double[] data); private native long nativeCreateStringFromByteArray(long context, byte[] data); private native long nativeCreateProto(long context, SerializedMessage data); diff --git a/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.cc b/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.cc index f4829c794..203d1fbcb 100644 --- a/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.cc +++ b/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.cc @@ -354,8 +354,6 @@ JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateGpuBuffer)( #endif // !defined(MEDIAPIPE_DISABLE_GPU) -// TODO: Add vector creators. - JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Array)( JNIEnv* env, jobject thiz, jlong context, jfloatArray data) { jsize count = env->GetArrayLength(data); @@ -376,6 +374,45 @@ JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Array)( return CreatePacketWithContext(context, packet); } +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt16Vector)( + JNIEnv* env, jobject thiz, jlong context, jshortArray data) { + jsize count = env->GetArrayLength(data); + jshort* data_ref = env->GetShortArrayElements(data, nullptr); + static_assert(std::is_same::value, "jshort must be int16_t"); + std::unique_ptr> shorts = + absl::make_unique>(data_ref, data_ref + count); + + env->ReleaseShortArrayElements(data, data_ref, JNI_ABORT); + mediapipe::Packet packet = mediapipe::Adopt(shorts.release()); + return CreatePacketWithContext(context, packet); +} + +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt32Vector)( + JNIEnv* env, jobject thiz, jlong context, jintArray data) { + jsize count = env->GetArrayLength(data); + jint* data_ref = env->GetIntArrayElements(data, nullptr); + static_assert(std::is_same::value, "jint must be int32_t"); + std::unique_ptr> ints = + absl::make_unique>(data_ref, data_ref + count); + + env->ReleaseIntArrayElements(data, data_ref, JNI_ABORT); + mediapipe::Packet packet = mediapipe::Adopt(ints.release()); + return CreatePacketWithContext(context, packet); +} + +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt64Vector)( + JNIEnv* env, jobject thiz, jlong context, jlongArray data) { + jsize count = env->GetArrayLength(data); + jlong* data_ref = env->GetLongArrayElements(data, nullptr); + static_assert(std::is_same::value, "jlong must be int64_t"); + std::unique_ptr> longs = + absl::make_unique>(data_ref, data_ref + count); + + env->ReleaseLongArrayElements(data, data_ref, JNI_ABORT); + mediapipe::Packet packet = mediapipe::Adopt(longs.release()); + return CreatePacketWithContext(context, packet); +} + JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Vector)( JNIEnv* env, jobject thiz, jlong context, jfloatArray data) { jsize count = env->GetArrayLength(data); @@ -393,6 +430,19 @@ JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Vector)( return CreatePacketWithContext(context, packet); } +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat64Vector)( + JNIEnv* env, jobject thiz, jlong context, jdoubleArray data) { + jsize count = env->GetArrayLength(data); + jdouble* data_ref = env->GetDoubleArrayElements(data, nullptr); + static_assert(std::is_same::value, "jdouble must be double"); + std::unique_ptr> doubles = + absl::make_unique>(data_ref, data_ref + count); + + env->ReleaseDoubleArrayElements(data, data_ref, JNI_ABORT); + mediapipe::Packet packet = mediapipe::Adopt(doubles.release()); + return CreatePacketWithContext(context, packet); +} + JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt32Array)( JNIEnv* env, jobject thiz, jlong context, jintArray data) { jsize count = env->GetArrayLength(data); diff --git a/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.h b/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.h index 0b448ae79..7b74ac3a3 100644 --- a/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.h +++ b/mediapipe/java/com/google/mediapipe/framework/jni/packet_creator_jni.h @@ -104,9 +104,21 @@ JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateGpuBuffer)( JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Array)( JNIEnv* env, jobject thiz, jlong context, jfloatArray data); +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt16Vector)( + JNIEnv* env, jobject thiz, jlong context, jshortArray data); + +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt32Vector)( + JNIEnv* env, jobject thiz, jlong context, jintArray data); + +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt64Vector)( + JNIEnv* env, jobject thiz, jlong context, jlongArray data); + JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat32Vector)( JNIEnv* env, jobject thiz, jlong context, jfloatArray data); +JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateFloat64Vector)( + JNIEnv* env, jobject thiz, jlong context, jdoubleArray data); + JNIEXPORT jlong JNICALL PACKET_CREATOR_METHOD(nativeCreateInt32Array)( JNIEnv* env, jobject thiz, jlong context, jintArray data);