JNI方法静态分辨率验证

时间:2012-04-06 16:55:56

标签: java android reflection java-native-interface

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

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

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

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;  
        }     
    } 
} 

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用UnsatisfiedLinkError和一个虚拟方法来检查是否加载了给定类的本机方法:

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

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