2012-04-06 129 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