У меня есть библиотека 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?
Спасибо!
Обратите внимание, что это свойство операционных систем, а не Java. – EJP
Спасибо. Я боялся, что это так. Я также думал, что могу создать 10 копий файла .so и использовать новый каждый раз, когда создаю новую оболочку. Любая идея, если это сработает? –
Если вы можете сделать экспортированную функцию и имена переменных уникальными через некоторую операцию массового переименования (objcopy?) ... Но это также сделает ваш apk более крупным. –