View.isInEditMode() 静态?

View.isInEditMode() statically?

我在我的应用程序中使用 JNI。在 Java 类 中需要原生的东西,我像这样加载原生库:

static
{
    System.loadLibrary("nativeegl");
}

老实说我不知道​​静态的东西到底做了什么,但我想这是为了确保 nativeegl 库在其他任何事情之前被加载。不记得我从哪里得到这个图案了。

现在如果这是一个 View 子类,并且我在 Android Studio 中使用图形编辑器,编辑器无法加载视图子类,因为这个异常:

java.lang.UnsatisfiedLinkError: no nativeegl in java.library.path

由于 View.isInEditMode() 是一个实例方法,我不能在 static{} 块中使用它。

有其他选择吗?也许我可以以不同的方式加载库?

考虑到这一点,一种可能的解决方法是将您的 View 代码拆分为两个 class:实际的 View 和单独的独立 class ] 包含您的 JNI 代码,包括 static 块。为了这个答案的其余部分,我将分别称它们为 FooViewBarWrapper

然后,仅从 if (isInEditMode()) 块内的 FooView 中的代码引用 BarWrapper

这可能会阻止 BarWrapper 被 GUI 生成器使用的 Java/pseudoAndroid 环境加载,因此不会触发加载本机库的尝试。至少,Dalvik class 加载规则会导致 BarWrapper 被忽略,因为 classes 仅在首次使用时加载,在您的情况下,您将跳过所有代码使用 BarWrapper。希望 GUI 生成器代码遵循 Dalvik 处理它的方式,尽管这还远不能保证,因为它是 运行 在 Java VM 上,而不是 Android VM(Dalvik 或 ART)。

这可能会使您的代码更加笨拙,因为您必须将逻辑拆分为两个 class 而不是一个。但是,这可能值得一试。