2014-08-27 3 views
1

У меня есть библиотека JNI, которую я написал для сбора данных датчика (в основном, акселерометра и гироскопа) и выполнения некоторых алгоритмов обнаружения данных по указанным данным. Обнаруженные функции настраиваются через несколько файлов конфигурации. Когда функции обнаруживаются, JNI использует обратный вызов для уведомления java-стороны приложения. Все это отлично работает.Создание нескольких копий библиотеки JNI с Java

Теперь я хочу иметь несколько экземпляров одной и той же библиотеки JNI, работающих одновременно (так что я могу сразу распознавать функции из нескольких файлов конфигурации). Для этого я написал класс 'wrapper', который реализует обратные вызовы для библиотеки JNI и также заботится обо всех инициализациях библиотеки. Я планировал просто создать экземпляр этого класса и использовать каждый экземпляр отдельно. Я обнаружил, что, хотя каждый экземпляр оболочки различен, библиотека повторно используется в разных экземплярах почти так же, как это было объявлено статически. Когда я пытаюсь инициализировать библиотеку из второго экземпляра класса Wrapper, я считаю, что он уже инициализирован.

Вот класс обертка похож на код, который я написал:

public class JNIWrapper { 

    public native int initializeJNI(String configPath); 
    public native void endProcessing(); 
    public native int getInstanceIdFromJNI(); 

    public JNIWrapper(){ 
     try { 
      System.loadLibrary("libjnicode.so"); 
     } 
     catch (Exception e) { 
      Log.e("JNI", "WARNING: Could not load libjnicode.so: " + e.getMessage()); 
     } 
    } 

    public int initialize(String configPath){ 
     return initializeJNI(configPath); 
    } 
    public void stop(){ 
     endProcessing(); 
    } 
    public void callbackFromJNI(int output, int instanceId){ 
     //notify the subscribed application(s) of the feature detection 
     //via message passing. 
    } 
} 

Кто-нибудь знает, как я могу создать несколько копий библиотеки JNI?
Спасибо!

ответ

4

Вы не можете этого сделать. Динамический компоновщик будет загружать только один файл .so в один процесс.

В идеале вы должны изменить библиотеку, чтобы дать ей легкий объектно-ориентированный стиль, позволяющий создавать экземпляры и инициализировать их (а не статическое состояние на уровне процесса) из ваших конфигурационных файлов или вызовов. Это не обязательно так сложно, как кажется - в основном поместить все ваше состояние в структуру и передать указатель на нее через все ваши вызовы. У вас будет один сеанс редактора марафона, который приведет к усталому пасту «пасты», а затем к некоторой ошибке очистки. К счастью, как только вы удалите статические переменные, вы получите ошибки компиляции во всех остальных попытках их использования.

Очень хакерской альтернативой может быть объявление некоторых служб удаленного процесса в вашем AndroidManifest.xml и загрузка библиотеки в каждый из них. Или, действительно, взломав модель андроида (и при теоретическом риске случайного убийства), загрузите библиотеку в несколько исполняемых исполняемых файлов со встроенными по требованию.

+1

Обратите внимание, что это свойство операционных систем, а не Java. – EJP

+0

Спасибо. Я боялся, что это так. Я также думал, что могу создать 10 копий файла .so и использовать новый каждый раз, когда создаю новую оболочку. Любая идея, если это сработает? –

+1

Если вы можете сделать экспортированную функцию и имена переменных уникальными через некоторую операцию массового переименования (objcopy?) ... Но это также сделает ваш apk более крупным. –

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