2012-04-06 4 views
0

Мне интересно, можно ли проверить на Java под Android SDK, что метод в классе Java, реализованный как собственный метод JNI, был разрешен статически? Ниже приводится объяснение того, что я ищу.Проверка статического разрешения JNI

У меня есть класс Java, который частично реализован как класс JNI. Этот класс можно инициализировать статически, если соответствующая библиотека 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? –

+0

Привет Кит, ты был прав. Мой вопрос неверен. Мне нужно переформулировать его. Это не связано со статической библиотекой. Речь идет о проверке того, что конкретный метод JNI разрешен и не требует дополнительной загрузки библиотеки. Скажем, у меня есть два подхода: (1) Одна динамическая библиотека libcombined.so, которая включает libhelper.a и другие статические библиотеки. (2) Несколько динамических библиотек, загружаемых по требованию при создании объекта для определенного класса. libhelper.so - один из них. В случае (1) мне не нужно загружать libhelper.so. В случае (2) мне нужно загрузить libhelper.so. – MikhailV

+0

Итак, пожалуйста, отредактируйте свой вопрос соответствующим образом. – EJP

ответ

1

Вы можете использовать UnsatisfiedLinkError и фиктивный метод, чтобы проверить, загружая нативные методы данного класса:

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

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

Спасибо. Он работает, хотя он немного похож на хак. Есть еще один способ - просто проверить существование libhelper.so, но ваш путь более ясен, я думаю. Приветствия. – MikhailV

Смежные вопросы