From 0d90c33380d5b6929aae9bbfdaf33ab0ac6057b1 Mon Sep 17 00:00:00 2001 From: Xiang Silian Date: Wed, 17 Sep 2025 22:49:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=B8=B2=E6=9F=93=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../khronos/vulkan_samples/MainActivity.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/app/android/java/com/khronos/vulkan_samples/MainActivity.java b/app/android/java/com/khronos/vulkan_samples/MainActivity.java index 656b146..7806f5e 100644 --- a/app/android/java/com/khronos/vulkan_samples/MainActivity.java +++ b/app/android/java/com/khronos/vulkan_samples/MainActivity.java @@ -18,11 +18,16 @@ import androidx.core.content.ContextCompat; import com.google.androidgamesdk.GameActivity; import com.google.common.util.concurrent.ListenableFuture; +import com.google.mediapipe.tasks.components.containers.NormalizedLandmark; import com.google.mediapipe.tasks.vision.core.RunningMode; +import com.google.mediapipe.tasks.vision.facelandmarker.FaceLandmarkerResult; import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -202,8 +207,46 @@ public class MainActivity extends GameActivity implements FaceLandmarkerHelper.L Log.e(TAG, "onError: Face Error"); } + private ByteBuffer nativeBuffer = null; + float[] points = new float[480 * 3]; + + @Override public void onResults(FaceLandmarkerHelper.@NotNull ResultBundle resultBundle) { - Log.e(TAG, "On Face Result"); + FaceLandmarkerResult faceLandmarkerResult = resultBundle.getResult(); + int height = resultBundle.getInputImageHeight(); + int width = resultBundle.getInputImageWidth(); + int bufferSize = 480 * 3 * 4; + + if(nativeBuffer == null) + { + // 创建直接ByteBuffer(在native内存中) + nativeBuffer = ByteBuffer.allocateDirect(bufferSize); + nativeBuffer.order(ByteOrder.nativeOrder()); + } + + + int index = 0; + // Iterate through each detected face + for (List faceLandmarks : faceLandmarkerResult.faceLandmarks()) { + //should be 1 + + int arrayIndex = 0; + for (NormalizedLandmark p : faceLandmarks) + { + //Log.i(TAG, "Index" + index + " x:"+p.x() + " y:"+p.y() + " z:"+p.z()); + points[arrayIndex++] = p.x(); + points[arrayIndex++] = p.y(); + points[arrayIndex++] = p.z(); + index++; + } + } + + // 转换为FloatBuffer并填充数据 + FloatBuffer floatBuffer = nativeBuffer.asFloatBuffer(); + floatBuffer.put(points); + floatBuffer.position(0); + passDataToNative(nativeBuffer, index, width, height); } + public native void passDataToNative(ByteBuffer buffer, int pointCount, int width, int height); } \ No newline at end of file