Android 不满意的链接错误

Android 不满意的链接错误,android,java-native-interface,native,unsatisfiedlinkerror,Android,Java Native Interface,Native,Unsatisfiedlinkerror,我们有一个加载本机库的应用程序,该库提供 我们要调用的本地方法。在某些手机上(尤其是速度较慢的手机) 一个),这会导致一个问题。无论何时,都会发生不满意的链接错误 (我认为)库仍在“加载”,并调用了一个方法 过早地 有没有办法处理这个问题?就像检查库是否已加载一样。即使在速度较慢的设备上,对System.loadLibrary()的调用也非常快;但是如果你的应用程序运行多线程,或者如果涉及静态构造函数的类只是为了响应某个UI事件而加载的,那么可能存在竞争条件:依赖于本机库的其他一些类将导致崩溃

我们有一个加载本机库的应用程序,该库提供 我们要调用的本地方法。在某些手机上(尤其是速度较慢的手机) 一个),这会导致一个问题。无论何时,都会发生不满意的链接错误 (我认为)库仍在“加载”,并调用了一个方法 过早地


有没有办法处理这个问题?就像检查库是否已加载一样。

即使在速度较慢的设备上,对
System.loadLibrary()的调用也非常快;但是如果你的应用程序运行多线程,或者如果涉及静态构造函数的类只是为了响应某个UI事件而加载的,那么可能存在竞争条件:依赖于本机库的其他一些类将导致崩溃

不禁止对所有具有本机方法的类使用调用
System.loadLibrary()
的静态构造函数。您可能会看到一些关于本机库被多次加载的警告,但这不会产生负面后果

有时,当应用程序第一次运行时,我们使用自定义Java代码将本机库提取到目录中,而不是依赖系统安装程序将它们放入目录中。这应该格外小心,所有活动(双关语)都应该等到libs(通常是从APK的assets文件夹中)提取完成


另一个问题是,对于某些设备,系统库可能会使用库的名称。在这种情况下,
System.loadLibrary()
将从/System/lib而不是从您的应用程序加载库;但这很难解释3秒延迟的影响。

您能发布一段代码说明本机库是如何加载的吗?我通常使用静态作用域,库是从.jar文件加载的。不过,我要指出的是,有些手机上的库加载得很好,不会导致上述问题。下面是一些代码:静态{System.loadLibrary(“libraryBeingLoaded”);}您确定您的库是针对您正在运行的体系结构编译的吗?如果它只包含ARMEABI v7版本而不包含ARMEABI,该怎么办?那么它在ARMEABI架构上就不起作用了。啊,谢谢你的链接。然而,我们使用的是Gradle,根据这个链接(),有必要将它放在一个“.jar”中。另外,还需要补充的是,当我们延迟调用本机方法的时间(比如加载应用程序后的3秒)时,它可以正常工作。3秒是任意的,所以我没有去做这个黑客。是的,事实上是这样。我敢肯定,它确实有效,因为有为该体系结构提供的库。然而,就我所知,延迟是必要的。是的,可能有比赛条件。然而,奇怪的是,调用的其中一个本机方法没有导致任何不满意的linkerror。然后调用另一个本机方法,就会出现此UnsatifiedLinkError。至于你的第三个案例,虽然,它似乎不是问题,因为它确实运行,如果有一些延迟。我认为我的问题与你提到的第一个案例有关。然而,我不确定如何继续。谢谢你的回复,顺便说一句。调用的本机方法之一没有导致任何不满意的链接错误。调用另一个本机方法之后,确实会出现这个UnsatifiedLinkError,这听起来像是inetersting。请提供相关的(已过滤的)
logcat-v threadtime
,其中包括在调用每个本机方法之前和之后立即出现的日志消息。问题似乎是(但仍未确认),即在第一个方法之前调用的第二个方法(导致不满意LinkErroro的方法)。它类似于:ApiClass.Start()-假设它启动api ApiClass.DoSomething()。我认为发生的是ApiClass.DoSomething()首先被调用。@Harold.Hernandez:我希望你能找到为什么会发生这种情况。无论如何,到那时ApiClass静态构造函数应该已经完成了它的工作。