我正在使用一个java安全提供程序,它从javax.security.auth.login包抛出failedloginexception。当我在android应用程序中使用这些提供者时,我遇到了一个问题:androids javax.security.auth.login包没有这样的类,它只有loginexception,这是其他类的基类。因此,每当抛出failedloginexception时,我的应用程序就会抛出noclassdeffound。
有没有办法将这个缺失的标准java类添加到我的android应用程序中,或者解决这个错误?
感谢您的帮助!
3条答案
按热度按时间dw1jzc5e1#
有没有办法将这个缺失的标准java类添加到我的android应用程序中,或者解决这个错误?
阿飞,不,不。
我想我们能给你的最好建议是:
不要这样做你的用户身份验证!
android不支持所有的
javax.security.**
,尤其是它不支持jaas身份验证和授权框架,这显然是您正在尝试使用的。请参见:
android的jaas
在android上使用jaas(java身份验证和授权服务)
虽然从理论上讲,将jaas移植到android是可能的,但我还没有发现任何证据表明有人成功地做到了这一点。
h9a6wy2h2#
java中的noclassdeffounderror与classnotfoundexception不同,当java虚拟机在运行时找不到编译时可用的特定类时,就会出现noclassdeffounderror。请参阅:解决JavaJ2EE中java.lang.noclassdeffounderror的3种方法
在androidstudio项目浏览器中检查rt.jar:externallibraries-><1.8>->rt.jar->javax->security->auth->login->。您可以看到failedloginexception存在。
现在检查外部库->->android.jar->javax->security->auth->login->。您可以看到failedloginexception不存在。
这意味着您的库由rt.jar编译,现在与android.jar一起使用。另一方面,您不能将rt.jar与android应用程序一起使用(并且与android.jar有些重叠)。因为它是桌面jre的运行库,而不是android。请参阅:android studio-android.jar和rt.jar冲突
现在要解决您的问题,您可以将源代码放到外部库中并重写它。了解如何在android应用程序中使用rt.jar中的类吗?
我建议自己用一些调试函数来实现这个类,以避免其他依赖类的实现。
另一种不推荐的方法是从这里下载jar并将其添加到项目中。
2mbi3lxu3#
当开发任何新的android操作系统时,都会附带一堆java类,这些类为需要这些类才能运行的应用程序提供支持。在本例中,让我们考虑一下时间api。它被添加到androidapi级别26,因此,使用这个库的应用程序将在较低的api级别上崩溃,比如marshmallow(api 23)。
这就是脱毛的时候。它允许较低的api级别使用新的java库。我们将看看它是如何做到这一点的,但在此之前,让我们启动androidstudio进行一个快速演示,让事情变得更清楚。
要解决这个问题,我们需要使用以下步骤在我们的项目中启用去糖化。
将android gradle plugin设置为4.0或更高版本。
在compileoptions中,启用corelibrarydesugaringenabled标志,并将java目标和源代码兼容性设置为java8。
在compileoptions中,启用corelibrarydesugaringenabled标志,并将java目标和源代码兼容性设置为java8。
启用多索引(对于支持api级别20或更低的项目)
添加desugaring依赖项。