Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JNI共享库:如何维护全局变量?_Android_C_Java Native Interface_Shared Libraries_Shared Memory - Fatal编程技术网

Android JNI共享库:如何维护全局变量?

Android JNI共享库:如何维护全局变量?,android,c,java-native-interface,shared-libraries,shared-memory,Android,C,Java Native Interface,Shared Libraries,Shared Memory,我已经编写了一个共享库,可以通过linux系统和java的JNI调用访问它 该库应该有一个全局ringbuffer,它必须在JNI方法和其他本机方法中可用 我认为这不会是一个问题,因为当我从不同的程序访问SL时,全局变量总是应该的 但是现在,在我的JNI方法中,全局变量似乎没有初始化(它们应该是程序流强制的) 以下是我的例子: ringbuf_t ringbuffer; void internalMethod() { // this method is first called fro

我已经编写了一个共享库,可以通过linux系统和java的JNI调用访问它

该库应该有一个全局ringbuffer,它必须在JNI方法和其他本机方法中可用

我认为这不会是一个问题,因为当我从不同的程序访问SL时,全局变量总是应该的

但是现在,在我的JNI方法中,全局变量似乎没有初始化(它们应该是程序流强制的)

以下是我的例子:

ringbuf_t ringbuffer;

void internalMethod() {
    // this method is first called from system-program
    ringbuffer = ringbuf_new(5000);
}


JNIEXPORT jint JNICALL Java_example_read(JNIEnv *env, jobject This) {
    // this method is later called via JNI
    if (!ringbuffer) {
        LOGI("uhhh, why is that buffer not set?!");
    }
}

要使ringbuffer变量真正成为全局变量,使共享库的每个实例/调用都能访问该变量的同一个实例,我必须做些什么?

从注释中可以看出,您似乎希望在一个进程中分配内存,并在另一个进程中使用它

为此,研究共享内存可能是一个好主意:“man shmget”应该是一个好的开始

请注意,这与JNI没有特别的关系,而是来自操作系统的限制

编辑: 我建议你:

  • 阅读共享内存——你应该理解它是如何工作的
  • 首先尝试在两个简单的应用程序之间共享内存
  • 只有这样才能在JNI应用程序中实现

  • 您确定正在调用
    internalMethod()
    ?我将通过日志快速重新检查它。似乎你也在想。啊,我认为调用发生在不同的进程中,这就是问题所在吗?>你确定调用了internalMethod()吗。。。是的,我现在绝对肯定。另外,SL的_属性_((构造函数))-方法被调用两次,一次从System.loadLibrary调用,一次通过系统内部程序调用。不同的进程有不同的内存,这是进程定义的一部分。这是我的第一个SL,由于我的监视,我想(并且想知道!!)SL的全局变量实际上是全局的。所以我现在用这个想法来编程。这个问题有什么解决办法吗?是的,没错。我在进程#1中分配一个ringbuffer(如果尚未分配),并在进程#1中写入它。然后我想在进程2(JNI)中从中获取数据。理解并更改它将非常有趣:)正如您在示例中看到的,我使用的是一个ringbuffer结构。缓冲区本身是通过ringbuf_new()方法中的malloc()创建的。我是否也必须用shm方法替换这个malloc,或者它是否足以将
    ringbuffer
    存储到一个共享内存中?因为我在Android下,很遗憾,我没有可用的SHMEM(除了ASHMEM)。你把我推向了正确的方向,谢谢!您可以直接写入共享内存(就像写入文件一样)。如果您打算同时写入和读取此缓冲区,您还应该对生产者-消费者问题进行一些研究。