我有一個基於Java的Android應用程序,它使用兩個本機子模塊。我讓他們通過從進程A中獲取它作爲long
並將它傳遞給進程B來共享指針。我似乎遇到了與此內存區域有關的零星問題,這取決於當前的構建,而不是我剛剛做出的更改。在兩個本地應用程序之間共享內存
我需要用ashmem
正確做到這一點,或者是我的方法(本金)的聲音?
我有一個基於Java的Android應用程序,它使用兩個本機子模塊。我讓他們通過從進程A中獲取它作爲long
並將它傳遞給進程B來共享指針。我似乎遇到了與此內存區域有關的零星問題,這取決於當前的構建,而不是我剛剛做出的更改。在兩個本地應用程序之間共享內存
我需要用ashmem
正確做到這一點,或者是我的方法(本金)的聲音?
沒有保證存儲器在一個方法,該方法是:a)到另一通道,b)以相同的虛擬位置,c)中線程安全的。
我做的是內存映射相同的文件分成多個流程和使用不安全類在此內存中執行線程安全的操作。
英特爾這項工作,應該在最新的ARM處理器工作,ARM處理器然而舊版本,我相信仍然在使用具有弱內存一致性保證,並且可能是不可靠的共享內存。
這是不可能的共享本機應用程序之間的指針,因爲每個(本機)的應用程序有它自己的內存空間映射&。 Android確實提供瞭解決此問題的機制,稱爲匿名共享內存。這實際上是基於Linux的實現爲同一目的。 Checkout this來自android的文件,瞭解更多有關在android中分享內存的信息。
下面是我使用的方案:
1) FD = ashmem_create_region( 「my_shm_region」,大小); (fd < 0) 返回-1;如果(fd < 0) 返回-1; unsigned char * dataptr = mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);如果(數據== MAP_FAILED) 轉出;
2)然後,可以通過FD到其他本機應用程序,並調用:
無符號字符* dataptr = MMAP(NULL,大小,PROT_READ | PROT_WRITE,MAP_SHARED,FD,0);
以下是我建議:
1)通過ashm分配共享存儲器:
int fd = ashmem_create_region(name, size);
ashmem_pin_region(fd, 0, 0);
uint8_t *shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2)FD可以使用粘合劑另一機進程共享。有關活頁夾的更多信息,請閱讀this stack overflow answer。
3)在其他的本機代碼可以這樣做:
uint8_t *shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fdclient, 0);
其中fdclient在上述步驟2)獲得的。
你使用'ashmem'來完成這個嗎?你是否說我需要使用'mmap'?我意識到我可以使用更慢,更佔用內存的解決方案:1)在proc A上執行內存中的任務2)通過JNI將內存複製到Java 3)通過JNI將內存複製到proc B,4)反向重複 – EntangledLoops
如果你使用'不安全'來訪問'mmap',但是在Android上我並不使用OpenJDK/Oracle JVM上的JNI。我不使用額外的圖書館,儘管我寫了一個更容易做到這一點。當你有一個ByteBuffer指向一個內存區域時,它可以在沒有額外複製的情況下在Java中使用,你正在讀/寫它。 –
您的意思是「它可以在沒有額外複製的情況下用於Java」?除了什麼之外呢?我必須從C創建它的地方複製內存,然後回到C處理它的地方,然後再將結果重新洗牌。在我看來,我的選擇是A)通過學習這種'mmap'式解決方案而遭受挫折,或者B)使用效率較低/健壯的複製過程。我錯了嗎? – EntangledLoops