我在我的应用中使用JNI。在需要本机的Java类中,我加载了本机库,如下所示:
static
{
System.loadLibrary("nativeegl");
}
说实话,我不知道静态的东西到底是什么,但我想这是为了确保nativeegl
库先于其他任何东西加载。不记得我从哪里得到这种模式。
现在,如果这是View
子类,并且我在Android Studio中使用图形编辑器,则由于此异常,编辑器无法加载视图子类:
java.lang.UnsatisfiedLinkError: no nativeegl in java.library.path
由于View.isInEditMode()
是一种实例方法,我无法在static{}
块中使用它。
还有其他选择吗?也许我可以加载不同的库?
答案 0 :(得分:0)
现在我考虑一下,一种可能的解决方法是将您的View
代码拆分为两个类:实际的View
,以及一个包含JNI代码的独立类,包括{{ 1}}阻止。出于本答复其余部分的目的,我将分别称为static
和FooView
。
然后,仅引用BarWrapper
块中BarWrapper
内的代码中的FooView
。
这可能会阻止GUI构建器使用的Java / pseudoAndroid环境加载if (isInEditMode())
,因此不会触发加载本机库的尝试。 Leastways,Dalvik类加载规则会导致BarWrapper
被忽略,因为类只在首次使用时才会被加载,在您的情况下,您将跳过使用BarWrapper
的所有代码。希望GUI构建器代码遵循Dalvik如何处理它,尽管这远远不能保证,因为它运行在Java VM上,而不是Android VM(Dalvik或ART)。
它可能会使您的代码更加笨重,因为您必须在两个类之间分离逻辑而不是仅仅一个。但是,它可能值得一个实验。