From 634d22f3be1a3b6e87d74cf9381a7d7bcaecd412 Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Sun, 30 Nov 2025 12:22:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8A=A8=E7=94=BB=E5=88=87?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/main.cpp | 20 +++--- .../java/com/hmwl/face_sdk/FaceActivity.java | 4 +- .../com/inewme/uvmirror/MakeupActivity.kt | 61 ++++++++++++------- vulkan/FaceApp.cpp | 6 +- 4 files changed, 57 insertions(+), 34 deletions(-) diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index 25b1bb7..e205bd6 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -82,7 +82,7 @@ void android_main(struct android_app *pApp) { auto frameTime = end_time - last_update_time; last_update_time = end_time; auto function_time = (end_time - start_time); - aout << "function_time:" << function_time << " fps:" << (1000/frameTime) << std::endl; + //aout << "function_time:" << function_time << " fps:" << (1000/frameTime) << std::endl; if(function_time < 35) { this_thread::sleep_for(chrono::milliseconds((35-function_time))); @@ -246,7 +246,18 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_hmwl_face_1sdk_FaceActivity_PreReadAction(JNIEnv *env, jobject thiz, jstring motion, jobject callback) { - g_callback = env->NewGlobalRef(callback); + // 清理旧的全局引用 + if (g_callback != nullptr) { + env->DeleteGlobalRef(g_callback); + g_callback = nullptr; + } + + // 保存新的回调 + if (callback != nullptr) { + g_callback = env->NewGlobalRef(callback); + } else { + g_callback = nullptr; + } const char *nativeString = env->GetStringUTFChars(motion, nullptr); jsize len = env->GetStringUTFLength(motion); @@ -254,12 +265,7 @@ Java_com_hmwl_face_1sdk_FaceActivity_PreReadAction(JNIEnv *env, jobject thiz, js { aout << "ArgLen to long:" << len << std::endl; } - if(g_Application->isInited()) - { - g_Application->changeMotion(nativeString); - } - // TODO: implement PreReadAction() std::string ret = g_Application->preReadyMotion(nativeString, CppCallback); return env->NewStringUTF(ret.c_str()); } \ No newline at end of file diff --git a/app/src/main/java/com/hmwl/face_sdk/FaceActivity.java b/app/src/main/java/com/hmwl/face_sdk/FaceActivity.java index 813d0d0..399db81 100644 --- a/app/src/main/java/com/hmwl/face_sdk/FaceActivity.java +++ b/app/src/main/java/com/hmwl/face_sdk/FaceActivity.java @@ -282,7 +282,7 @@ public class FaceActivity extends GameActivity implements FaceLandmarkerHelper.L } protected native void ChangeStateCpp(String json); - protected void ChangeState(String json){ + protected void ChangeMotion(String json){ Log.i("FaceActivity", "ChangeState:" + json); ChangeStateCpp(json); } @@ -291,6 +291,6 @@ public class FaceActivity extends GameActivity implements FaceLandmarkerHelper.L @Override public void onEmpty() { // 当没有检测到人脸时的处理逻辑 - Log.d(TAG, "No face detected in the current frame"); + //Log.d(TAG, "No face detected in the current frame"); } } \ No newline at end of file diff --git a/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt b/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt index e932058..4ca279c 100644 --- a/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt +++ b/example/src/main/java/com/inewme/uvmirror/MakeupActivity.kt @@ -9,7 +9,6 @@ import android.widget.Toast import com.hmwl.face_sdk.FaceActivity import com.hmwl.face_sdk.InitArg import com.hmwl.face_sdk.Motion -import org.json.JSONArray import org.json.JSONObject import java.io.BufferedReader import java.io.InputStreamReader @@ -17,11 +16,11 @@ import java.io.InputStreamReader class MakeupActivity : FaceActivity() { - private var curIndex = 0 private var pngFilesByFolder: List? = null override fun onCreate(savedInstanceState: Bundle?) { + FaceInit(this) val initArg = InitArg().apply { @@ -34,13 +33,15 @@ class MakeupActivity : FaceActivity() super.onCreate(savedInstanceState) var motion = getMotionByIndex(0); - var jsonString = motion.toJson() - val result = PreLoadAction(jsonString) { motion_type -> - // 在这里处理回调结果 - println("OnLoadActionFinished: $motion_type") - ChangeState(motion_type); - } - //Toast.makeText(this, "4.png", Toast.LENGTH_LONG).show() + var motionJsonString = motion.toJson() + val result = PreLoadAction(motionJsonString,object : CallbackInterface { + override fun OnLoadActionFinished(motion_type: String) { + //加载完成后,切断到对应的动画 + Log.i("info","加载完成后,切换到对应的动画") + ChangeMotion(motion_type) + } + }) + Toast.makeText(this, "开始加载动画: $result", Toast.LENGTH_SHORT).show() } private fun getMotionByIndex(index: Int): Motion { @@ -65,31 +66,45 @@ class MakeupActivity : FaceActivity() return "" } + var nextMotionLoadFinished = false + var nextMotionType = "" override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { - Log.d("TouchEvent", "手指按下 - X: ${event.x}, Y: ${event.y}") - if(curIndex == 31) - { - - } - } - MotionEvent.ACTION_MOVE -> { - Log.d("TouchEvent", "手指移动 - X: ${event.x}, Y: ${event.y}") - } - MotionEvent.ACTION_UP -> { - Log.d("TouchEvent", "手指抬起") - curIndex++ pngFilesByFolder?.let { folders -> if (curIndex > folders.size - 1) { + //动画播放完成,切换到主界面 curIndex = 0 Stop(); finish(); } - ChangeState(getCurMotionState(curIndex)) - Toast.makeText(this, folders[curIndex].folderName, Toast.LENGTH_LONG).show() } } + + MotionEvent.ACTION_UP -> { + if (!nextMotionLoadFinished) + { + var nextMotion = getMotionByIndex(curIndex + 1); + var json_str = nextMotion.toJson() + PreLoadAction(json_str,object : CallbackInterface { + override fun OnLoadActionFinished(motion_type: String) { + Log.i("info","加载完成后,还会继续播放当前的动画,可以手动切换动画") + nextMotionLoadFinished = true; + nextMotionType = motion_type; + } + }) + Toast.makeText(this, "开始加载下一个动画 ${nextMotion.type}", Toast.LENGTH_SHORT).show() + } + else + { + //手动切换动画 + ChangeMotion(nextMotionType); + nextMotionLoadFinished = false; + curIndex++; + Toast.makeText(this, "切换到下一个动画 $nextMotionType", Toast.LENGTH_SHORT).show() + } + + } } return true } diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index d68062c..2a72b9c 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -1371,12 +1371,13 @@ void FaceApp::changeMotion(const string motion_type) std::unique_lock lock_changeMotion(changeMotionMtx); - for (int i = 0; i < this->m_texs.size(); ++i) + + for (int i = 0; i < _nextMotion.png_names.size(); ++i) { destroyTexture(device, m_texs[i]); } - for (int i = 0; i < m_texs_next.size(); ++i) + for (int i = 0; i < _nextMotion.png_names.size(); ++i) { m_texs[i] = m_texs_next[i]; m_texs_next[i].reset(); @@ -1385,6 +1386,7 @@ void FaceApp::changeMotion(const string motion_type) update_descriptor_set(m_texs); _curMotion_type = motion_type; _curMotion_png_size = _nextMotion.png_names.size(); + _motionState = ready; // for (int i = 0; i < _curMotion.png_names.size(); ++i)