gpt4 book ai didi

java - JNI方法静态解析验证

转载 作者:行者123 更新时间:2023-12-01 15:26:55 25 4
gpt4 key购买 nike

我想知道是否可以在 Android SDK 下的 Java 中验证作为 native JNI 方法实现的 Java 类中的方法是否已静态解析?下面是我正在寻找的内容的解释。

我有一个 Java 类,它部分实现为 JNI 类。如果相应的 JNI 库已创建为静态库(例如 libhelper.a),则可以静态初始化此类。或者,如果相应的 JNI 库实现为动态库(例如 libhelper.so),则可以动态初始化它。在动态初始化的情况下,类应该有一个加载动态库的静态初始化程序 - libhelper.so。我正在使用这两种情况,并且我想为它们保留相同的源代码。为此,我想在静态初始化程序中验证相应的 native 方法是否已被解析。如果是这样,我就不需要加载动态库了。如果为假,则意味着我必须加载动态库。问题是我不知道如何验证类中的方法是否已经解决。

下面的示例有不正确的行,这表明了我的 Intent 。

package com.sample.package;
public class MyUtilityClass
{
private static final String TAG = "MyUtilityClass";
public MyUtilityClass () {
Log.v(TAG, " MyUtilityClass constructor");
}
public static native int initMyHelperClass();
public static native int performHelpAction(String action);
public static native int uninitMyHelperClass();

static {
try {
/* Here I want to verify that the native method
initMyHelperClass has has been already resolved.
In this code snippet I am just comparing it to null,
which is not correct. It should be something different. */
if (initMyHelperClass == null) {
/* initMyHelperClass has not been resolved yet,
load the dynamic library - libhelper.so */
System.loadLibrary("helper");
}
} catch (UnsatisfiedLinkError ule) {
/*Library not found. We should throw second exception. */
throw ule;
}
}
}

谢谢。

最佳答案

您可以使用UnsatisfiedLinkError和虚拟方法来检查给定类的 native 方法是否已加载:

private static native void checkMe();  // does nothing

static {
try {
checkMe();
} catch (UnsatisfiedLinkError e) {
System.loadLibrary("checkLibrary");
}
}

关于java - JNI方法静态解析验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10046593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com