2012-04-06 73 views
0

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

我有一个部分实现为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; 
     }  
    } 
} 

谢谢。

+1

我不明白你的静态库的意思。 JNI总是使用动态库加载。或者你重新链接你的JVM? – 2012-04-06 17:32:44

+0

嗨基思,你说得对。我的问题是不正确的。我需要重新制定它。它与静态库无关。关于验证,特定的JNI方法已解决,不需要额外的库加载。 假设我有两种方法: (1)一个包含libhelper.a和其他静态库的动态库libcombined.so。 (2)当创建特定类的对象时,需要加载多个动态库。 libhelper.so就是其中之一。在情况下(1)我不需要加载libhelper.so。 在情况下(2)我需要加载libhelper.so。 – MikhailV 2012-04-06 18:25:24

+0

所以请相应地编辑你的问题。 – EJP 2012-04-07 00:20:22

回答

1

你可以使用UnsatisfiedLinkError和虚拟方法来检查是否加载给定类的本地方法:

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

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

谢谢。它的工作原理虽然看起来有点像黑客。还有另一种方法就是验证libhelper.so的存在,但我认为你的方式更加清晰。干杯。 – MikhailV 2012-04-09 05:52:45