You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子模块调用依赖接口静态方法触发java.lang.NoSuchMethodError求临时方案

问题场景

我按以下步骤操作后,Android应用启动直接崩溃:

  1. 编写一个Java Library,定义包含静态方法的接口并打包成Jar:
public interface InterfaceTest {
    static int test() {
        return 0x16;
    }
}
  1. 创建名为sdk的Android Library模块,通过api files('libs/lib.jar')引入上述Jar包,编写调用代码:
public class Main {
    public static int create() {
        return InterfaceTest.test();
    }
}
  1. 创建Android应用模块,通过implementation project(':sdk')引入sdk模块,在Activity中调用sdk的方法:
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Toast.makeText(this, Main.create().toString(), Toast.LENGTH_SHORT).show()
    }
}
  1. 执行assembleDebug打包安装后,应用启动触发崩溃,错误日志如下:
FATAL EXCEPTION: main
    Process: io.github.sgpublic.jartest, PID: 18931
    java.lang.NoSuchMethodError: No static method test()I in class Lio/github/sgpublic/lib/InterfaceTest; or its super classes (declaration of 'io.github.sgpublic.lib.InterfaceTest' appears in /data/app/~~YvfX66D6YZcRxdFMHi5zSg==/io.github.sgpublic.jartest-FIbOhcbOzGnvL9VwL_K9UA==/base.apk)
    at io.github.sgpublic.sdk.Main.create(Main.java:12)
    at io.github.sgpublic.jartest.MainActivity.onCreate(MainActivity.kt:12)
    at android.app.Activity.performCreate(Activity.java:8143)
    at android.app.Activity.performCreate(Activity.java:8114)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3513)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3700)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:236)
    at android.app.ActivityThread.main(ActivityThread.java:8060)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
临时解决方案

方案1:调整依赖配置

将sdk模块中对Jar包的依赖从api改为implementation,同时在应用模块中添加对该Jar包的compileOnly依赖:

  • 修改sdk模块的build.gradle:
implementation files('libs/lib.jar')
  • 在应用模块的build.gradle中添加(需将Jar包拷贝到应用模块的libs目录,或使用正确的路径引用):
compileOnly files('libs/lib.jar')

方案2:转换Java Library为Android Library

把原本的Java Library改成Android Library模块,让sdk模块通过api project(':your-java-lib-module')引入,这样依赖传递会正确处理接口中的静态方法。

方案3:反射调用静态方法

在sdk模块的Main.create()方法中,通过反射获取并调用目标静态方法,绕过依赖传递的问题:

public class Main {
    public static int create() {
        try {
            Class<?> clazz = Class.forName("io.github.sgpublic.lib.InterfaceTest");
            Method method = clazz.getMethod("test");
            return (int) method.invoke(null);
        } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

内容的提问来源于stack exchange,提问作者Madray Haven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:55:17