Java JNI方法静态分辨率验证
我想知道是否有可能在Android SDK下用Java验证作为本机JNI方法实现的Java类中的方法是静态解析的?下面是我要找的东西的解释 我有一个部分实现为JNI类的Java类。如果相应的JNI库已创建为静态库(例如libhelper.a),则可以静态初始化此类。或者,如果相应的JNI库实现为动态库(例如libhelper.so),则可以动态初始化它。在动态初始化的情况下,类应该有一个加载动态库的静态初始值设定项–libhelper.so。我正在使用这两种情况,我想为它们保留相同的源代码。为此,我想在静态初始值设定项中验证是否已经解析了相应的本机方法。如果这是真的,我不需要加载动态库。如果为false,则意味着我必须加载动态库。问题是我不知道如何验证类中的方法是否已被解决 下面的示例有不正确的行,这表明了我的意图Java JNI方法静态分辨率验证,java,android,reflection,java-native-interface,Java,Android,Reflection,Java Native Interface,我想知道是否有可能在Android SDK下用Java验证作为本机JNI方法实现的Java类中的方法是静态解析的?下面是我要找的东西的解释 我有一个部分实现为JNI类的Java类。如果相应的JNI库已创建为静态库(例如libhelper.a),则可以静态初始化此类。或者,如果相应的JNI库实现为动态库(例如libhelper.so),则可以动态初始化它。在动态初始化的情况下,类应该有一个加载动态库的静态初始值设定项–libhelper.so。我正在使用这两种情况,我想为它们保留相同的源代码。为此
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;
}
}
}
谢谢。您可以使用
UnsatifiedLinkError
和伪方法检查是否加载了给定类的本机方法:
private static native void checkMe(); // does nothing
static {
try {
checkMe();
} catch (UnsatisfiedLinkError e) {
System.loadLibrary("checkLibrary");
}
}
我不明白你说的静态库是什么意思。JNI总是使用动态库加载。还是重新链接JVM?嗨,Keith,你是对的。我的问题不对。我需要重新制定它。它与静态库无关。它是关于验证的,特定的JNI方法被解析,并且不需要额外的库负载。假设我有两种方法:(1)一个动态库libcombined.so包括libhelper.a和其他静态库。(2) 在创建特定类的对象时按需加载多个动态库。libhelper.so就是其中之一。在案例(1)中,我不需要加载libhelper.so。如果(2)我需要加载libhelper.so.so,请相应地编辑您的问题。谢谢。虽然它看起来有点像黑客,但它仍然有效。还有另一种方法就是验证libhelper。所以存在,但我认为你的方法更清楚。干杯