【发布时间】:2013-03-26 13:10:42
【问题描述】:
我编写了一个共享库,可以通过我的 linux 系统和来自 java 的 JNI 调用访问它。
该库应该有一个全局环形缓冲区,它必须在 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 变量真正成为全局变量,以便每个实例/对共享库的调用都访问该变量的同一个实例?
【问题讨论】:
-
您确定正在调用
internalMethod()吗? -
我将通过日志记录快速重新检查它。看来你也想知道。啊,我认为调用发生在不同的进程中,是这个问题吗?
-
> 你确定 internalMethod() 被调用了吗? ...是的,我现在绝对确定。 SL 的 __attribute__((constructor)) 方法也被调用了两次,一次来自 System.loadLibrary,一次通过系统内部程序。
-
不同的进程有不同的内存,这是进程定义的一部分
-
嗯,这是我的第一个 SL,由于我的监控,我认为(并且想知道!!)SL 的全局变量确实是全局的。所以我现在已经用这个想法对其进行了编程。这个问题有解决办法吗?
标签: android c java-native-interface shared-libraries shared-memory