-
game-activity 库说明:https://developer.android.com/games/agdk/game-activity/get-started?hl=zh-cn 测试背景:Android Studio 官方 GameActivity (C++) 模板项目。使用了
本质上,它是一个 gradle 包 ( game-activityConfig.cmake: if(NOT TARGET game-activity::game-activity)
add_library(game-activity::game-activity STATIC IMPORTED)
set_target_properties(game-activity::game-activity PROPERTIES
IMPORTED_LOCATION "C:/Users/Kexuan Zhang/.gradle/caches/transforms-3/ec6d535c6f5e9a4e6af3f40c13762731/transformed/games-activity-1.2.2/prefab/modules/game-activity/libs/android.x86/libgame-activity.a"
INTERFACE_INCLUDE_DIRECTORIES "C:/Users/Kexuan Zhang/.gradle/caches/transforms-3/ec6d535c6f5e9a4e6af3f40c13762731/transformed/games-activity-1.2.2/prefab/modules/game-activity/include"
INTERFACE_LINK_LIBRARIES ""
)
endif()
if(NOT TARGET game-activity::game-activity_static)
add_library(game-activity::game-activity_static STATIC IMPORTED)
set_target_properties(game-activity::game-activity_static PROPERTIES
IMPORTED_LOCATION "C:/Users/Kexuan Zhang/.gradle/caches/transforms-3/ec6d535c6f5e9a4e6af3f40c13762731/transformed/games-activity-1.2.2/prefab/modules/game-activity_static/libs/android.x86/libgame-activity_static.a"
INTERFACE_INCLUDE_DIRECTORIES "C:/Users/Kexuan Zhang/.gradle/caches/transforms-3/ec6d535c6f5e9a4e6af3f40c13762731/transformed/games-activity-1.2.2/prefab/modules/game-activity_static/include"
INTERFACE_LINK_LIBRARIES ""
)
endif() 官方提供了 CMake 写法: find_package(game-activity REQUIRED CONFIG)
...
target_link_libraries(... android game-activity::game-activity) 我现在想仅用 xmake 实现,不用 CMake。有没有大神指导如何实现? 我尝试过使用 add_requires("cmake::game-activity", configs = { moduledir = "$(从 .cxx 目录中找到的 cmake 目录)" }) 使用的是 path.joint 和 os.scriptdir 配合,以及 os.dirs + 通配符 的形式,找到的绝对路径。 这种方式是不可以的,行不通,依旧找不到 game-activity。而且从 .cxx 中找貌似并不是合理的行为。 假设 .cxx 生成后,我倒是可以暴力解决。 首先我定义了一个模板文件 add_rules("mode.debug", "mode.release")
target("someengineandroidapp")
set_kind("shared")
add_files("*.cpp")
add_linkdirs("$(LINK_DIRS)")
add_includedirs("$(INCLUDE_DIRS)")
add_links("game-activity", "EGL", "GLESv3", "jnigraphics", "android", "log") 然后我写一个 python 脚本读取 .cxx 文件夹下的 game-activityConfig.cmake 解析然后替换模板中的值,生成 xmake.lua,再执行,是可行的。 import os
import re
import glob
def find_cmake_file(script_dir):
# 构建搜索路径
search_path = os.path.join(script_dir, "../../../.cxx/**/game-activity/game-activityConfig.cmake")
# 使用 glob 搜索匹配的文件
cmake_files = glob.glob(search_path, recursive=True)
if cmake_files:
return cmake_files[0] # 返回第一个匹配的文件路径
else:
return None
def parse_cmake_file(cmake_file):
with open(cmake_file, 'r') as file:
content = file.read()
# 使用正则表达式解析 IMPORTED_LOCATION 和 INTERFACE_INCLUDE_DIRECTORIES
imported_location_match = re.search(r'IMPORTED_LOCATION\s+"([^"]+)"', content)
interface_include_match = re.search(r'INTERFACE_INCLUDE_DIRECTORIES\s+"([^"]+)"', content)
if imported_location_match and interface_include_match:
imported_location = imported_location_match.group(1)
interface_include = interface_include_match.group(1)
return os.path.dirname(imported_location), interface_include
else:
return None, None
def modify_xmake_lua_template(xmake_lua_template, xmake_lua, link_dirs, include_dirs):
with open(xmake_lua_template, 'r') as file:
content = file.read()
# 替换 $(LINK_DIRS) 和 $(INCLUDE_DIRS)
content = content.replace('$(LINK_DIRS)', link_dirs)
content = content.replace('$(INCLUDE_DIRS)', include_dirs)
with open(xmake_lua, 'w') as file:
file.write(content)
if __name__ == "__main__":
# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.realpath(__file__))
# 寻找 cmake 文件
cmake_file = find_cmake_file(script_dir)
if cmake_file:
print(f"找到 CMake 文件: {cmake_file}")
# 解析 cmake 文件
imported_location, interface_include = parse_cmake_file(cmake_file)
if imported_location and interface_include:
print(f"IMPORTED_LOCATION: {imported_location}")
print(f"INTERFACE_INCLUDE_DIRECTORIES: {interface_include}")
# 构建 xmake.lua.template 和 xmake.lua 文件路径
xmake_lua_template = os.path.join(script_dir, "xmake.lua.template")
xmake_lua = os.path.join(script_dir, "xmake.lua")
# 修改 xmake.lua.template 文件并导出为 xmake.lua
modify_xmake_lua_template(xmake_lua_template, xmake_lua, imported_location, interface_include)
print("xmake.lua 文件已生成")
else:
print("无法解析 CMake 文件")
else:
print("未找到 CMake 文件") 但问题是 .cxx 文件是 gradle 产生的临时文件夹,这样合理嘛?然后,gradle 是如何生成 .cxx 文件夹的?有没有比较官方的实现方案?如果不存在,是否可以添加相应功能? 更新:有了思路,我应该可以把 Game-Activity 的 C++ 源码和 include 抠下来拿来用。可能是更合适的方式。测试中。。。 |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 5 replies
-
不同构建系统之间没有规范进行通信,没什么好办法。 |
Beta Was this translation helpful? Give feedback.
-
已解决。需要自行将 GameActivity 相关的 C++ 源码下载下来,作为 xmake 配置的静态链接库,然后 Android 项目使用 xmake-gradle 配置。相关的配置我都调好了。建议采用 GameActivity 1.2.2 稳定版本。相关代码地址: 很方便,在 Android 项目目录命令行执行 |
Beta Was this translation helpful? Give feedback.
做是肯定能做的,首先它有 官方地址,但是这个地址多半被 q 了,不太好下
我已经将它放到了 xmake-mirror 了。。
可以优先下这个。。
然后里面每个子库,可以通过 add_configs 方式,选择性启用,如果有 so/.a 库,可以直接用,反正也就是给 android 。。
如果源码库,自己加个 xmake.lua port 下