2013-03-26 39 views
0

我已经写了一个共享库,可以通过我的linux系统和Java的JNI调用访问。带JNI的共享库:如何维护全局变量?

该库应该有一个全局环缓冲区,它必须在JNI方法和其他本地方法中可用。

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

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

这是我的例子:

什么我必须做的,使ringbuffer变量真正全球化,所以每个实例/调用共享库的访问之一,该变量的同一个实例?

+0

你肯定'internalMethod()'被调用? – msam 2013-03-26 13:24:28

+0

我将通过日志记录快速检查它。好像你也在想。啊,我认为这些电话会发生在不同的过程中,是这个问题吗? – 2013-03-26 14:05:14

+0

>你确定internalMethod()被调用吗? ...是的,我现在绝对确定。同样,SL的__attribute __((构造函数)) - 方法被调用两次,一次从System.loadLibrary调用,一次通过系统内部的程序调用。 – 2013-03-26 14:10:55

回答

0

从评论看来,你想分配你的记忆在一个过程中,并在另一个使用它。

为此,查看共享内存可能是个好主意:'man shmget'应该是一个好的开始。

请注意,这与JNI没有特别关系,是OS的限制。

编辑: 我建议你:

  1. 共享内存读了 - 你应该明白这是如何工作的概念。 2个简单的应用
  2. 之间
  3. 第一次尝试共享内存只有在你的JNI应用程序中实现
+0

是的,这是正确的。如果尚未分配,则在进程#1中分配一个环缓冲区,并在进程#1中写入环缓冲区。然后我想在流程#2(JNI)中抓取它的数据。这将是veeeryy有趣的理解和改变它:) – 2013-03-26 14:36:33

+0

正如你可以看到在这个例子中,我使用了一个ringbuffer结构。缓冲区本身是通过ringbuf_new()方法中的malloc()创建的。我是否也必须用shm-method替换这个malloc,还是应该将'ringbuffer'存储到共享内存中? – 2013-03-26 15:00:34

+0

由于我在Android下,我很遗憾没有SHMEM可用(但ASHMEM)。你把我推向了正确的方向,谢谢! – 2013-03-26 15:53:18

相关问题