Android 从Java实例化JNI库的多个副本

Android 从Java实例化JNI库的多个副本,android,android-ndk,java-native-interface,instantiation,Android,Android Ndk,Java Native Interface,Instantiation,我有一个JNI库,我写过它来捕获传感器(主要是加速计和陀螺仪)数据,并对这些数据进行一些特征检测算法。检测到的功能可通过几个配置文件进行配置。当检测到这些特性时,JNI使用回调通知应用程序的java端。所有这些都很有效 现在我希望能够同时运行同一JNI库的多个实例(这样我就可以一次识别多个配置文件中的功能)。为此,我编写了一个“包装器”类来实现JNI库的回调,并负责库的所有初始化。我计划简单地实例化这个类并分别使用每个实例。我发现,虽然每个包装器实例都是不同的,但库在实例之间的重用几乎就像它是静

我有一个JNI库,我写过它来捕获传感器(主要是加速计和陀螺仪)数据,并对这些数据进行一些特征检测算法。检测到的功能可通过几个配置文件进行配置。当检测到这些特性时,JNI使用回调通知应用程序的java端。所有这些都很有效

现在我希望能够同时运行同一JNI库的多个实例(这样我就可以一次识别多个配置文件中的功能)。为此,我编写了一个“包装器”类来实现JNI库的回调,并负责库的所有初始化。我计划简单地实例化这个类并分别使用每个实例。我发现,虽然每个包装器实例都是不同的,但库在实例之间的重用几乎就像它是静态声明的一样。当我尝试从包装类的第二个实例初始化库时,我发现它已经被初始化了

下面是一个类似于我编写的代码的包装器类:

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库的多个副本吗?

谢谢

你不能那样做。动态链接器只会将给定的.so文件加载到进程中一次

理想情况下,您可以修改该库,使其具有轻量级的面向对象风格,允许您从配置文件或调用创建实例并初始化这些实例(而不是进程级静态状态)。这并不一定像看上去那么复杂——基本上是将所有状态放在一个结构中,并在所有调用中传递指向它的指针。您将有一个marathon编辑器会话,导致手指疲劳“粘贴”,然后进行一些错误清理。幸运的是,一旦删除了静态变量,在所有剩余的尝试中都会出现编译错误


一个非常有黑客味的替代方法可能是在AndroidManifest.xml中声明一些远程进程服务,并将库加载到其中的每一个中。或者,真的打破了android模式(理论上有随机杀戮的风险),将库加载到多个按需创建的本机可执行文件中。

请注意,这是操作系统的属性,而不是Java。谢谢。恐怕情况就是这样。我还认为我可以生成10个.so文件的副本,并在每次实例化新包装器时使用一个新的副本。你知道这是否可行吗?如果你能通过一些批量重命名操作(objcopy?)使导出的函数和变量名唯一。。。但这也会让你的apk变大。