android 平台跑通中文路径

This commit is contained in:
xsl
2025-10-28 22:24:24 +08:00
parent 1dfc63543f
commit 13357ab256
20 changed files with 149 additions and 39 deletions
@@ -0,0 +1,20 @@
package com.hmwl.face_sdk;
import org.json.JSONObject;
public class InitArg {
public int action_fps;
public float zoom;
public Motion motion;
public String toJson() {
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("action_fps", action_fps);
jsonObject.put("zoom", zoom);
jsonObject.put("motion", motion.toJsonObject());
return jsonObject.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
@@ -0,0 +1,36 @@
package com.hmwl.face_sdk;
import org.json.JSONObject;
public class Motion {
public String type;
public String technique;
public String step;
public String show_type;
public String png_name;
public int png_num;
public JSONObject toJsonObject() {
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("type", type);
jsonObject.put("technique", technique);
jsonObject.put("step", step);
jsonObject.put("show_type", show_type);
jsonObject.put("png_name", png_name);
jsonObject.put("png_num", png_num);
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String toJson() {
try {
return toJsonObject().toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@@ -2,16 +2,30 @@ package com.hmwl.example;
import android.os.Bundle; import android.os.Bundle;
import com.hmwl.face_sdk.InitArg;
import com.hmwl.face_sdk.Motion;
import com.hmwl.face_sdk.FaceActivity; import com.hmwl.face_sdk.FaceActivity;
public class MainActivity extends FaceActivity{ public class MainActivity extends FaceActivity{
@Override @Override
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
SetInitArg("{\"action_fps\":3,\"motion\":{\"png_name\":\"test\",\"png_num\":1,\"show_type\":\"direction\",\"step\":\"press2\",\"technique\":\"base_makeup\",\"type\":\"bottom_makeup\"},\"zoom\":1.5}"); Motion motion = new Motion();
motion.type = "底妆";
motion.technique = "基础上妆";
motion.step = "2按压";
motion.show_type = "方向示意图";
motion.png_name = "test";
motion.png_num = 1;
InitArg initArg = new InitArg();
initArg.action_fps = 3;
initArg.zoom = 1.5f;
initArg.motion = motion;
SetInitArg(initArg.toJson());
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
//这个是设置接口的参数,采用json传递,可以保证接口灵活性
//比如设置对应的化妆步骤为
ChangeState("{\"step\":\"0\"}");
} }
} }
+28
View File
@@ -21,6 +21,34 @@ void VK_CHECK(VkResult ret)
//#endif //#endif
// return path; // return path;
//} //}
#ifdef _WIN32
std::vector<unsigned char> AppBase::readFileUnsignedCharWin32(const std::wstring path, bool example)
{
std::vector<unsigned char> buffer;
std::wstring enginePath = L"app/src/main/assets/" + path;
if (example)
{
enginePath = L"example/src/main/assets/" + path;
}
std::ifstream file{ enginePath, std::ios::ate | std::ios::binary };
if (!file.is_open())
{
throw std::runtime_error("failed to open file: ");
}
size_t fileSize = static_cast<size_t>(file.tellg());
buffer.resize(fileSize);
file.seekg(0);
file.read((char*)buffer.data(), fileSize);
file.close();
return buffer;
}
#endif // _WIN32
std::vector<unsigned char> AppBase::readFileUnsignedChar(const std::string& path, bool example) std::vector<unsigned char> AppBase::readFileUnsignedChar(const std::string& path, bool example)
{ {
+19 -1
View File
@@ -17,6 +17,7 @@
#define logOut std::cout #define logOut std::cout
#define GLFW_INCLUDE_VULKAN #define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <windows.h>
#else #else
#include "../app/src/main/cpp/AndroidOut.h" #include "../app/src/main/cpp/AndroidOut.h"
#define logOut aout #define logOut aout
@@ -69,7 +70,7 @@ public:
//std::string getPath(const std::string path); //std::string getPath(const std::string path);
VkShaderModule createShaderModule(VkDevice& device, const std::vector<char>& code); VkShaderModule createShaderModule(VkDevice& device, const std::vector<char>& code);
const std::vector<const char*> validationLayers = {"VK_LAYER_KHRONOS_validation"}; const std::vector<const char*> validationLayers = {"VK_LAYER_KHRONOS_validation"};
protected:
long long getCurrentTimeMillis() { long long getCurrentTimeMillis() {
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
auto duration = now.time_since_epoch(); auto duration = now.time_since_epoch();
@@ -87,6 +88,23 @@ protected:
void pickPhysicalDevice(VkPhysicalDevice& physicalDevice, VkSurfaceKHR& surface); void pickPhysicalDevice(VkPhysicalDevice& physicalDevice, VkSurfaceKHR& surface);
#ifdef _WIN32 #ifdef _WIN32
GLFWwindow *window; GLFWwindow *window;
std::vector<unsigned char> readFileUnsignedCharWin32(const std::wstring path, bool example);
static std::wstring UTF8ToWideString(const std::string& utf8str)
{
if (utf8str.empty()) return L"";
int wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(),
-1, nullptr, 0);
if (wideLen == 0) {
throw std::runtime_error("UTF-8转换失败");
}
std::vector<wchar_t> buffer(wideLen);
MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), -1,
buffer.data(), wideLen);
return std::wstring(buffer.data());
}
#endif #endif
bool enableValidationLayers = true; bool enableValidationLayers = true;
+7 -3
View File
@@ -639,10 +639,10 @@ Texture Application::loadTexture(std::string path, Texture& tex, bool srgb)
processWithVulkan(image.data(), w, h, w * 4, image.size(), tex, srgb); processWithVulkan(image.data(), w, h, w * 4, image.size(), tex, srgb);
return tex; return tex;
} }
#ifdef _WIN32
Texture Application::loadTextureExample(std::string path, Texture& tex, bool srgb) Texture Application::loadTextureExample(std::wstring path, Texture& tex, bool srgb)
{ {
std::vector<unsigned char> data = readFileUnsignedChar(path, true); std::vector<unsigned char> data = readFileUnsignedCharWin32(path, true);
std::vector<unsigned char> image; std::vector<unsigned char> image;
unsigned w, h; unsigned w, h;
unsigned error = lodepng::decode(image, w, h, data, LCT_RGBA, 8); unsigned error = lodepng::decode(image, w, h, data, LCT_RGBA, 8);
@@ -650,6 +650,10 @@ Texture Application::loadTextureExample(std::string path, Texture& tex, bool srg
return tex; return tex;
} }
#endif // _WIN32
void Application::createTexture(VkDevice device, VkPhysicalDevice physicalDevice, int width, int height, Texture& texture, bool srgb) void Application::createTexture(VkDevice device, VkPhysicalDevice physicalDevice, int width, int height, Texture& texture, bool srgb)
{ {
+3 -1
View File
@@ -75,7 +75,9 @@ protected:
protected: protected:
Texture loadTexture(std::string path, Texture& tex, bool srgb); Texture loadTexture(std::string path, Texture& tex, bool srgb);
Texture loadTextureExample(std::string path, Texture& tex, bool srgb); #ifdef _WIN32
Texture loadTextureExample(std::wstring path, Texture& tex, bool srgb);
#endif
uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter, uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter,
VkMemoryPropertyFlags properties); VkMemoryPropertyFlags properties);
+6 -3
View File
@@ -1146,16 +1146,19 @@ void FaceApp::changeMotion(Motion& motion)
_curMotion = _initArg.motion; _curMotion = _initArg.motion;
for (int i = 0; i < _curMotion.png_num; ++i) for (int i = 0; i < _curMotion.png_num; ++i)
{ {
#ifdef _WIN32
string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type; string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type;
string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png"; string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png";
#ifdef _WIN32 loadTextureExample(UTF8ToWideString(path_name), m_texs[i], true);
loadTextureExample(path_name, m_texs[i], true);
if (kThick) if (kThick)
{ {
string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png"; string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png";
loadTextureExample(path_name_ex, m_texs_ex[i], true); loadTextureExample(UTF8ToWideString(path_name_ex), m_texs_ex[i], true);
} }
#else #else
string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type;
string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png";
loadTexture(path_name, m_texs[i], true); loadTexture(path_name, m_texs[i], true);
if (kThick) if (kThick)
{ {
+10 -25
View File
@@ -1,23 +1,8 @@
#include "FaceApp.h" #include "FaceApp.h"
#include <windows.h>
std::wstring UTF8ToWideString(const std::string& utf8str)
{
if (utf8str.empty()) return L"";
int wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(),
-1, nullptr, 0);
if (wideLen == 0) {
throw std::runtime_error("UTF-8转换失败");
}
std::vector<wchar_t> buffer(wideLen);
MultiByteToWideChar(CP_UTF8, 0, utf8str.c_str(), -1,
buffer.data(), wideLen);
return std::wstring(buffer.data());
}
std::wstring ReadUTF8File(const std::string& filePath) std::wstring ReadUTF8File(const std::string& filePath)
{ {
@@ -32,7 +17,7 @@ std::wstring ReadUTF8File(const std::string& filePath)
file.close(); file.close();
// 将UTF-8字符串转换为宽字符串 // 将UTF-8字符串转换为宽字符串
return UTF8ToWideString(content); return AppBase::UTF8ToWideString(content);
} }
@@ -51,23 +36,23 @@ std::wstring ReadFileWithChinesePath(const std::wstring& filePath) {
file.seekg(0, std::ios::beg); file.seekg(0, std::ios::beg);
file.read(&context[0], context.size()); file.read(&context[0], context.size());
file.close(); file.close();
return UTF8ToWideString(context); return AppBase::UTF8ToWideString(context);
} }
int main() { int main() {
std::string path = "chinese.txt"; //std::string path = "chinese.txt";
std::wstring chinese = ReadUTF8File(path); //std::wstring chinese = ReadUTF8File(path);
std::wstring chinese_path = UTF8ToWideString("d:/测试目录/中文文件.txt"); //std::wstring chinese_path = AppBase::UTF8ToWideString("d:/测试目录/中文文件.txt");
std::wstring content = ReadFileWithChinesePath(chinese_path); //std::wstring content = ReadFileWithChinesePath(chinese_path);
InitArg init_arg; InitArg init_arg;
Motion motion; Motion motion;
motion.type = "bottom_makeup"; motion.type = "底妆";
motion.technique = "base_makeup"; motion.technique = "基础上妆";
motion.step = "press2"; motion.step = "2按压";
motion.show_type = "direction"; motion.show_type = "方向示意图";
motion.png_name = "test"; motion.png_name = "test";
motion.png_num = 1; motion.png_num = 1;
# #