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
块。为了这个答案的其余部分,我将分别称它们为 FooView
和 BarWrapper
。
然后,仅从 if (isInEditMode())
块内的 FooView
中的代码引用 BarWrapper
。
这可能会阻止 BarWrapper
被 GUI 生成器使用的 Java/pseudoAndroid 环境加载,因此不会触发加载本机库的尝试。至少,Dalvik class 加载规则会导致 BarWrapper
被忽略,因为 classes 仅在首次使用时加载,在您的情况下,您将跳过所有代码使用 BarWrapper
。希望 GUI 生成器代码遵循 Dalvik 处理它的方式,尽管这还远不能保证,因为它是 运行 在 Java VM 上,而不是 Android VM(Dalvik 或 ART)。
这可能会使您的代码更加笨拙,因为您必须将逻辑拆分为两个 class 而不是一个。但是,这可能值得一试。
我在我的应用程序中使用 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
块。为了这个答案的其余部分,我将分别称它们为 FooView
和 BarWrapper
。
然后,仅从 if (isInEditMode())
块内的 FooView
中的代码引用 BarWrapper
。
这可能会阻止 BarWrapper
被 GUI 生成器使用的 Java/pseudoAndroid 环境加载,因此不会触发加载本机库的尝试。至少,Dalvik class 加载规则会导致 BarWrapper
被忽略,因为 classes 仅在首次使用时加载,在您的情况下,您将跳过所有代码使用 BarWrapper
。希望 GUI 生成器代码遵循 Dalvik 处理它的方式,尽管这还远不能保证,因为它是 运行 在 Java VM 上,而不是 Android VM(Dalvik 或 ART)。
这可能会使您的代码更加笨拙,因为您必须将逻辑拆分为两个 class 而不是一个。但是,这可能值得一试。