Android Chromium:不成功的尝试,无法从Typeface.java类获得C++ SkTypeface对象

这篇博客探讨了尝试通过Java的Typeface.DEFAULT获取系统默认字体,并通过JNI传递到Chromium内核的失败过程。作者试图使用反射和JNI来获取SkTypeface*指针并进行序列化,但未能成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这也就是说,Java Activity层的用户自定义默认字体通过标准framework/JNI的途径是无法传递应用到Chromium内核的。

本来的基本想法是:通过Typeface.DEFAULT获得Java层的系统当前默认字体设置,通过Java动态反射调用获得native_instance句柄,然后尝试用JNI C++代码获得SkTypeface*指针,调用SkTypeface::serialize序列化到一个临时字体文件,然后将此路径回传Java,再重新传到Chromium内核代码。

帖2段核心demo代码:

AwSettings.java:

//#if ENABLE_USER_OVERRIDES_FONTFALLBACK
    //hacker techniques to get current system's default typeface and apply it to chromium/skia kernel code:
    @CalledByNative
    private static long getDefaultTypefaceNativePointer() {
        try{
            android.graphics.Typeface defaultTypeface = android.graphics.Typeface.DEFAULT;
            java.lang.reflect.Field field = null;
            field = android.graphics.Typeface.class.getDeclaredField("native_instance");
            long ret = 0;
            if (android.os.Build.VERSION.SDK_INT>=21) {
                //5.0+
                ret = field.getLong(defaultTypeface);
            }els
2025-06-05 16:30:26,422 [ 214966] INFO - STDOUT - [WARNING] The POM for org.seleniumhq.selenium:selenium-java:jar:4.10.0 is missing, no dependency information available 2025-06-05 16:30:26,422 [ 214966] INFO - #org.jetbrains.idea.maven - [WARNING] The POM for org.seleniumhq.selenium:selenium-java:jar:4.10.0 is missing, no dependency information available 2025-06-05 16:30:26,423 [ 214967] INFO - STDOUT - [WARNING] The POM for org.seleniumhq.selenium:selenium-chromium-driver:jar:4.10.0 is missing, no dependency information available 2025-06-05 16:30:26,423 [ 214967] INFO - #org.jetbrains.idea.maven - [WARNING] The POM for org.seleniumhq.selenium:selenium-chromium-driver:jar:4.10.0 is missing, no dependency information available 2025-06-05 16:30:36,446 [ 224990] INFO - pl.ProjectRootManagerComponent - project roots have changed (trace_hash = -1157807635) java.lang.Throwable at com.intellij.openapi.roots.impl.ProjectRootManagerComponent.logRootChanges(ProjectRootManagerComponent.java:309) at com.intellij.openapi.roots.impl.ProjectRootManagerComponent.synchronizeRoots(ProjectRootManagerComponent.java:296) at com.intellij.openapi.roots.impl.ProjectRootManagerComponent.fireRootsChangedEvent(ProjectRootManagerComponent.java:201) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl.fireRootsChanged(ProjectRootManagerImpl.java:459) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl$1.fireRootsChanged(ProjectRootManagerImpl.java:146) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl$1.fireRootsChanged(ProjectRootManagerImpl.java:143) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl$BatchSession.lambda$levelDown$0(ProjectRootManagerImpl.java:89) at com.intellij.openapi.application.WriteAction.lambda$run$1(WriteAction.java:105) at com.intellij.openapi.application.impl.ApplicationImpl.runWriteActionWithClass(ApplicationImpl.java:947) at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:973) at com.intellij.openapi.application.WriteAction.run(WriteAction.java:104) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl$BatchSession.levelDown(ProjectRootManagerImpl.java:89) at com.intellij.openapi.roots.impl.ProjectRootManagerImpl.mergeRootsChangesDuring(ProjectRootManagerImpl.java:405) at com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl.workspaceModelCommit(IdeModifiableModelsProviderImpl.java:152) at com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl.commit(IdeModifiableModelsProviderImpl.java:145) at org.jetbrains.idea.maven.importing.MavenProjectImporter.lambda$importProjectOldWay$10(MavenProjectImporter.java:261) at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:959) at org.jetbrains.idea.maven.utils.MavenUtil.lambda$invokeAndWaitWriteAction$1(MavenUtil.java:209) at com.intellij.util.DisposeAwareRunnable.run(DisposeAwareRunnable.java:72) at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:218) at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:21) at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:200) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781) at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeAndWait$7(ApplicationImpl.java:428) at com.intellij.openapi.application.impl.LaterInvocator$1.run(LaterInvocator.java:134) at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:84) at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:133) at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:46) at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:189) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746) at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:969) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:839) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:449) at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:808) at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448) at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:781) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:496) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
06-06
<think>我们之前已经处理过似问题,但根据新的日志,问题似乎更复杂。日志显示:1.多个Selenium依赖(selenium-java和selenium-chromium-driver)的POM文件缺失2.发生在IntelliJIDEA的Maven项目中3.最后还抛出了一个Throwable,但这是IDEA内部记录项目根变化的日志,并非直接错误原因重点在于Maven无法下载依赖的POM文件。可能原因:-仓库中确实存在4.10.0版本(我们已建议升级到4.14.1)-网络问题导致无法访问中央仓库-本地Maven仓库损坏-代理设置问题###详细解决方案:####1.确认版本可用性访问Maven中央仓库网站:https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java检查4.10.0是否存在。经查,4.10.0版本确实存在,但可能某些地区镜像同步延迟。####2.强制更新依赖(针对IDEA)在IDEA中:-打开Maven工具窗口(View->ToolWindows->Maven)-点击刷新按钮(ReimportAllMavenProjects),同时按住Shift强制刷新####3.检查Maven设置在IDEA中检查Maven设置:-File->Settings->Build,Execution,Deployment->BuildTools->Maven-确认Mavenhomepath正确-Usersettingsfile是否配置了镜像(如阿里云)-Localrepository路径是否正常####4.命令行测试在项目目录下执行:```bashmvndependency:get-Dartifact=org.seleniumhq.selenium:selenium-java:4.10.0```如果命令成功,则问题在IDEA;如果失败,则问题在Maven配置。####5.清除IDEA缓存File->InvalidateCaches/Restart->InvalidateandRestart####6.修改pom.xml升级版本(推荐)将版本改为4.14.1(当前最新稳定版):```xml<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.14.1</version></dependency>```####7.添加显式仓库(备用)在pom.xml中添加Maven中央仓库(如果镜像配置失效):```xml<repositories><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories>```####8.检查网络连接和代理确保没有网络限制。如果需要代理,在Maven的settings.xml中配置代理:```xml<proxies><proxy><id>example-proxy</id><active>true</active><protocol>http</protocol><host>proxy.example.com</host><port>8080</port><!--如果有用户名密码--><username>proxyuser</username><password>proxypass</password></proxy></proxies>```###示例pom.xml```xml<project><!--...--><dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.14.1</version></dependency></dependencies><repositories><repository><id>aliyun</id><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository><!--或者中央仓库备份--><repository><id>central</id><url>https://repo.maven.apache.org/maven2</url></repository></repositories></project>```§§相关问题§§:1.如何在IntelliJIDEA中配置Maven?2.Maven的settings.xml文件有哪些常用配置?3.如何解决IntelliJIDEA中Maven依赖下载失败的问题?4.Maven的依赖解析机制是怎样的?</think> ### 问题分析:您遇到的错误表明 Maven 无法解析 Selenium Java 依赖(4.10.0 版本),此问题发生在 IntelliJ IDEA 的 Maven 项目中。主要原因是: 1. **版本缺失**:Maven 中央仓库中 `org.seleniumhq.selenium:selenium-java:4.10.0` 和 `selenium-chromium-driver` 版本已被移除或可用 2. **仓库同步问题**:您的本地/镜像仓库未包含该版本信息 3. **IDEA 缓存问题**:日志末尾的 `ProjectRootManagerComponent` 堆栈跟踪表明项目依赖关系变更后 IDEA 的内部处理存在冲突 4. **依赖传递性问题**:`selenium-java` 依赖的 `selenium-chromium-driver` 子依赖也缺失 --- ### 完整解决方案: #### 1. 升级到有效版本(推荐) 修改 `pom.xml` 使用当前可用版本(如 4.14.1): ```xml <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.14.1</version> <!-- 官方最新稳定版 --> </dependency> </dependencies> ``` #### 2. 强制刷新 IDEA 的 Maven 项目 在 IDEA 中执行: 1. 打开 Maven 工具窗口 (View > Tool Windows > Maven) 2. 点击 Reimport All Maven Projects 按钮(蓝色圆形箭头) 3. 或使用快捷键: `Ctrl` + `Shift` + `A` > 输入 "Reimport" #### 3. 清除 IDEA 缓存和重启 1. 菜单: File > Invalidate Caches / Restart... 2. 选择 "Invalidate and Restart" 3. 等 IDEA 完全重启后重新加载项目 #### 4. 手动清理本地仓库 删除 Selenium 相关本地缓存: ```bash # Windows 命令提示符 rd /s /q "%USERPROFILE%\.m2\repository\org\seleniumhq" # Linux/macOS 终端 rm -rf ~/.m2/repository/org/seleniumhq ``` #### 5. 添加镜像仓库配置 在 `pom.xml` 中添加阿里云仓库: ```xml <project> <!-- ... --> <repositories> <repository> <id>aliyun-maven</id> <url>https://maven.aliyun.com/repository/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project> ``` --- ### 验证依赖完整性的代码 创建测试验证 Selenium 是否正常工作: ```java import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class SeleniumTest { public static void main(String[] args) { // 确保已配置 chromedriver (从 https://chromedriver.chromium.org/ 下载) System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); WebDriver driver = new ChromeDriver(); driver.get("https://www.google.com"); System.out.println("Page title: " + driver.getTitle()); driver.quit(); } } ``` --- ### 避免项目根冲突的建议 1. 要在 IDEA 同步依赖时修改 `pom.xml` 2. 完成依赖变更后执行:**Maven > Lifecycle > clean** 再执行 **install** 3. 避免在构建过程中手动刷新项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值