我有一個JNI庫,我已經寫入它來捕獲傳感器(主要是加速計和陀螺儀)數據,並對所述數據執行一些特徵檢測算法。檢測到的功能可通過幾個配置文件進行配置。當檢測到功能時,JNI使用回調通知應用程序的java端。所有這些都很好。實例化來自Java的JNI庫的多個副本
現在我希望能夠同時運行同一個JNI庫的多個實例(這樣我就可以同時識別多個配置文件中的功能)。爲此,我編寫了一個'包裝器'類,它實現了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 2014-08-27 20:03:38
謝謝。我很害怕這種情況。我也在想我可以生成10個.so文件的副本,並在每次實例化一個新包裝時使用一個新副本。任何想法,如果這將工作? – 2014-08-27 21:33:07
如果您可以通過一些大量重命名操作(objcopy?)使導出的函數和變量名唯一,但它會使您的apk放大。 – 2014-08-27 22:04:09