2013-03-26 57 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