156 lines
4.5 KiB
Python
156 lines
4.5 KiB
Python
|
|
#!/usr/bin/env python
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
NDK 编译脚本
|
|||
|
|
在编译前将 GBK 编码的源文件临时转换为 UTF-8,编译后恢复
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
import shutil
|
|||
|
|
import subprocess
|
|||
|
|
import glob
|
|||
|
|
|
|||
|
|
# 项目根目录
|
|||
|
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|||
|
|
CLASSES_DIR = os.path.join(PROJECT_ROOT, "Classes")
|
|||
|
|
BACKUP_DIR = os.path.join(PROJECT_ROOT, "proj.android", ".gbk_backup")
|
|||
|
|
|
|||
|
|
# NDK 路径
|
|||
|
|
NDK_BUILD = r"D:\Android\sdk\ndk\16.1.4479499\ndk-build.cmd"
|
|||
|
|
|
|||
|
|
def find_gbk_files():
|
|||
|
|
"""查找可能包含 GBK 编码中文的源文件"""
|
|||
|
|
gbk_files = []
|
|||
|
|
extensions = ['*.cpp', '*.h', '*.c']
|
|||
|
|
|
|||
|
|
for ext in extensions:
|
|||
|
|
pattern = os.path.join(CLASSES_DIR, '**', ext)
|
|||
|
|
for filepath in glob.glob(pattern, recursive=True):
|
|||
|
|
try:
|
|||
|
|
with open(filepath, 'rb') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
# 检查是否包含非 ASCII 字节(可能是中文)
|
|||
|
|
has_non_ascii = any(b > 127 for b in content)
|
|||
|
|
if has_non_ascii:
|
|||
|
|
# 尝试用 UTF-8 解码,如果失败则可能是 GBK
|
|||
|
|
try:
|
|||
|
|
content.decode('utf-8')
|
|||
|
|
except UnicodeDecodeError:
|
|||
|
|
gbk_files.append(filepath)
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Error checking {filepath}: {e}")
|
|||
|
|
|
|||
|
|
return gbk_files
|
|||
|
|
|
|||
|
|
def convert_to_utf8(filepath):
|
|||
|
|
"""将 GBK 文件转换为 UTF-8"""
|
|||
|
|
try:
|
|||
|
|
with open(filepath, 'rb') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
# 解码 GBK
|
|||
|
|
text = content.decode('gbk', errors='replace')
|
|||
|
|
|
|||
|
|
# 编码为 UTF-8
|
|||
|
|
with open(filepath, 'wb') as f:
|
|||
|
|
f.write(text.encode('utf-8'))
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Error converting {filepath}: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def backup_files(files):
|
|||
|
|
"""备份原始 GBK 文件"""
|
|||
|
|
if os.path.exists(BACKUP_DIR):
|
|||
|
|
shutil.rmtree(BACKUP_DIR)
|
|||
|
|
os.makedirs(BACKUP_DIR)
|
|||
|
|
|
|||
|
|
for filepath in files:
|
|||
|
|
rel_path = os.path.relpath(filepath, PROJECT_ROOT)
|
|||
|
|
backup_path = os.path.join(BACKUP_DIR, rel_path)
|
|||
|
|
os.makedirs(os.path.dirname(backup_path), exist_ok=True)
|
|||
|
|
shutil.copy2(filepath, backup_path)
|
|||
|
|
|
|||
|
|
print(f"Backed up {len(files)} files")
|
|||
|
|
|
|||
|
|
def restore_files(files):
|
|||
|
|
"""从备份恢复原始 GBK 文件"""
|
|||
|
|
restored = 0
|
|||
|
|
for filepath in files:
|
|||
|
|
rel_path = os.path.relpath(filepath, PROJECT_ROOT)
|
|||
|
|
backup_path = os.path.join(BACKUP_DIR, rel_path)
|
|||
|
|
if os.path.exists(backup_path):
|
|||
|
|
shutil.copy2(backup_path, filepath)
|
|||
|
|
restored += 1
|
|||
|
|
|
|||
|
|
print(f"Restored {restored} files")
|
|||
|
|
|
|||
|
|
# 清理备份目录
|
|||
|
|
if os.path.exists(BACKUP_DIR):
|
|||
|
|
shutil.rmtree(BACKUP_DIR)
|
|||
|
|
|
|||
|
|
def run_ndk_build(debug=False):
|
|||
|
|
"""运行 ndk-build"""
|
|||
|
|
os.chdir(os.path.join(PROJECT_ROOT, "proj.android"))
|
|||
|
|
|
|||
|
|
cmd = NDK_BUILD
|
|||
|
|
if not debug:
|
|||
|
|
cmd += " NDK_DEBUG=0"
|
|||
|
|
|
|||
|
|
print(f"Running: {cmd}")
|
|||
|
|
# 使用 os.system 来直接执行命令并显示输出
|
|||
|
|
return_code = os.system(cmd)
|
|||
|
|
return return_code == 0
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("NDK Build Script with GBK->UTF-8 Conversion")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 1. 查找 GBK 文件
|
|||
|
|
print("\n[1/5] Finding GBK encoded files...")
|
|||
|
|
gbk_files = find_gbk_files()
|
|||
|
|
print(f"Found {len(gbk_files)} GBK files")
|
|||
|
|
|
|||
|
|
if not gbk_files:
|
|||
|
|
print("No GBK files found, running ndk-build directly...")
|
|||
|
|
success = run_ndk_build()
|
|||
|
|
sys.exit(0 if success else 1)
|
|||
|
|
|
|||
|
|
# 2. 备份原始文件
|
|||
|
|
print("\n[2/5] Backing up original files...")
|
|||
|
|
backup_files(gbk_files)
|
|||
|
|
|
|||
|
|
# 3. 转换为 UTF-8
|
|||
|
|
print("\n[3/5] Converting to UTF-8...")
|
|||
|
|
converted = 0
|
|||
|
|
for filepath in gbk_files:
|
|||
|
|
if convert_to_utf8(filepath):
|
|||
|
|
converted += 1
|
|||
|
|
print(f" Converted: {os.path.relpath(filepath, PROJECT_ROOT)}")
|
|||
|
|
print(f"Converted {converted} files")
|
|||
|
|
|
|||
|
|
# 4. 运行 ndk-build
|
|||
|
|
print("\n[4/5] Running ndk-build...")
|
|||
|
|
success = run_ndk_build()
|
|||
|
|
|
|||
|
|
# 5. 恢复原始文件
|
|||
|
|
print("\n[5/5] Restoring original GBK files...")
|
|||
|
|
restore_files(gbk_files)
|
|||
|
|
|
|||
|
|
if success:
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("BUILD SUCCESSFUL!")
|
|||
|
|
print("=" * 60)
|
|||
|
|
else:
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("BUILD FAILED!")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
sys.exit(0 if success else 1)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|