You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

遇到JSR/RET与computeFrames不兼容错误,疑因mysql-connector-java版本问题

解决“JSR/RET are not supported with computeFrames”错误及代码优化建议

你的判断完全正确——这个错误确实是由mysql-connector-java-3.0.17-ga-bin这个老旧驱动版本导致的,下面给你详细的原因分析和解决方案:

错误根源

mysql-connector-java 3.0.17是2006年发布的超老版本,它的字节码中使用了JSR/RET指令。而Android的D8/R8编译器在启用computeFrames选项(默认开启,用于生成调试所需的栈帧信息)时,不支持这种过时的字节码指令,因此抛出了这个错误。

解决方案

1. 升级MySQL驱动(推荐)

直接替换为兼容Android的新版驱动,比如mysql-connector-java 8.0.x系列,或者更轻量的MariaDB Connector/J(与MySQL完全兼容)。

修改你的依赖配置:

// 替换旧依赖为新版MySQL驱动
implementation 'mysql:mysql-connector-java:8.0.33'
// 或者用更轻量的MariaDB驱动(兼容MySQL)
// implementation 'org.mariadb.jdbc:mariadb-java-client:3.2.0'

注意:新版MySQL驱动的Driver类路径已变更为com.mysql.cj.jdbc.Driver,你需要修改代码中的Class.forName参数;新版驱动也支持自动注册,甚至可以省略Class.forName这一步。

2. 临时绕过方案(不推荐)

如果暂时无法升级驱动,可以尝试在build.gradle中关闭computeFrames选项,但这会削弱调试体验,且老驱动存在大量安全漏洞和兼容性问题,不建议长期使用:

android {
    compileOptions {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                    "android.enableComputeFrames": "false"
                ]
            }
        }
    }
}

你的代码额外优化建议

除了驱动问题,你的数据库操作代码还有两个关键问题需要修复:

  • SQL注入风险:直接将用户输入的text拼接到SQL语句中,极易被攻击者利用进行SQL注入攻击。改为使用PreparedStatement
// 替换原有的Statement代码
String query = "INSERT INTO name (test) VALUES (?)";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1, text);
pstmt.executeUpdate();
  • 资源未正确释放conn.close()放在try块中,如果发生异常,连接会无法关闭,导致资源泄漏。应该放到finally块中:
Connection conn = null;
PreparedStatement pstmt = null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    conn = DriverManager.getConnection(DB_URL, USER, PASS);
    // ... 数据库操作
} catch (Exception e) {
    msg = "Connection goes wrong";
    e.printStackTrace();
} finally {
    try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

内容的提问来源于stack exchange,提问作者D-cent

火山引擎 最新活动