2012-04-06 15 views
0

Ich frage mich, ist es möglich, in Java unter dem Android SDK zu verifizieren, dass eine Methode in einer Java-Klasse, die als native JNI-Methode implementiert wurde, statisch aufgelöst wurde? Unten gibt es eine Erklärung dessen, wonach ich suche.JNI-Methode statische Auflösungsverifizierung

Ich habe eine Java-Klasse, die teilweise als JNI-Klasse implementiert ist. Diese Klasse kann statisch initialisiert werden, wenn die entsprechende JNI-Bibliothek als statische Bibliothek erstellt wurde (z. B. libhelper.a). Oder es kann dynamisch initialisiert werden, wenn die entsprechende JNI-Bibliothek als dynamische Bibliothek implementiert ist (z. B. libhelper.so). Im Falle einer dynamischen Initialisierung sollte die Klasse einen statischen Initialisierer haben, der die dynamische Bibliothek libhilper.so lädt. Ich verwende beide Fälle, und ich möchte für beide den gleichen Quellcode behalten. Zu diesem Zweck möchte ich im statischen Initialisierer überprüfen, ob die entsprechenden nativen Methoden bereits aufgelöst wurden. Wenn es wahr ist, muss ich die dynamische Bibliothek nicht laden. Wenn es falsch ist, bedeutet das, dass ich die dynamische Bibliothek laden muss. Das Problem ist, ich kann nicht überprüfen, ob eine Methode in der Klasse bereits aufgelöst wurde.

Das folgende Beispiel enthält falsche Zeilen, die meine Absicht zeigen.

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

Vielen Dank.

+1

Ich verstehe nicht, was Sie mit einer statischen Bibliothek bedeuten. JNI wird immer mit einer dynamischen Bibliothek geladen. Oder verbinden Sie Ihre JVM neu? –

+0

Hallo Keith, Sie hatten Recht. Meine Frage ist falsch. Ich muss es neu formulieren. Es bezieht sich nicht auf eine statische Bibliothek. Es geht um die Verifizierung, dass die bestimmte JNI-Methode aufgelöst wird und keine zusätzliche Bibliothekslast erfordert. Nehmen wir an, ich habe zwei Ansätze: (1) Eine dynamische Bibliothek libcombined.so, die libhelper.a und andere statische Bibliotheken enthält. (2) Mehrere dynamische Bibliotheken, die bei Bedarf geladen werden, wenn ein Objekt für die bestimmte Klasse erstellt wird. libhelper.so ist einer von ihnen. Im Fall (1) muss ich libhelper.so nicht laden. Im Fall (2) muss ich libhelper.so laden. – MikhailV

+0

Also bitte editieren Sie Ihre Frage entsprechend. – EJP

Antwort

1

Sie könnten UnsatisfiedLinkError und eine Dummy-Methode verwenden, wenn eine bestimmte Klasse native Methoden geladen werden, um zu überprüfen:

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

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

Danke. Es funktioniert, obwohl es ein bisschen wie ein Hack aussieht. Es gibt einen anderen Weg, um nur libhelper.so Existenz zu verifizieren, aber Ihr Weg ist klarer, denke ich. Prost. – MikhailV

Verwandte Themen