子模块调用依赖接口静态方法触发java.lang.NoSuchMethodError求临时方案
问题场景
我按以下步骤操作后,Android应用启动直接崩溃:
- 编写一个Java Library,定义包含静态方法的接口并打包成Jar:
public interface InterfaceTest { static int test() { return 0x16; } }
- 创建名为
sdk的Android Library模块,通过api files('libs/lib.jar')引入上述Jar包,编写调用代码:
public class Main { public static int create() { return InterfaceTest.test(); } }
- 创建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() } }
- 执行
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
相关产品推荐
相关产品推荐

