SORU
27 EKİM 2009, Salı


C işaretçileri arasında geçen ve JNI aracılığıyla Java

Şu anda, CUDA-işlevsellik, Java uygulaması oluşturmak için çalışıyorum. CUDA ve Java arasındaki bağlantı gayet iyi çalışıyor, ama başka bir sorun var ve eğer bu konuda düşüncelerimin doğru olup olmadığını sormak istedim.

Java yerel bir işlev aradığımda fonksiyonları bir şeyler hesaplar ve sonucu döndürür bazı veri geçtim. Geçebilir ki bu sonuç mümkün, ilk işlevi bir referans (işaretçi) dönmek ve sonuçtan daha sonraki hesaplamalar yapan başka bir işlevi JNI Ara.

Benim fikrim diğer fonksiyonları kullanabilmesi için GPU bellek verileri bırakarak ve GPU arasında veri kopyalama gelen yükü azaltmak için ve sadece bir başvuru geçiyordu.

Denedikten sonra bir süre kendi kendime düşündüm, bu işaretçiler uygulama sona erdikten sonra silinir çünkü mümkün olmamalı (Bu durumda, C-fonksiyonu sona erdirir). Bu doğru mu? Ya da sadece kötü C görmek çözüm mıyım?

Edit: Soruyu genişletmek için biraz (ya da daha açık olun): bellek JNI yerel fonksiyonları işlevi ne zaman biter? ayırmanın tarafından tahsis Edilir Ya ben hala da JNI uygulama uçları veya el ile ben ücretsiz ne kadar erişebilir?

Katkın için teşekkürler

CEVAP
27 EKİM 2009, Salı


Aşağıdaki yöntemi kullandım

JNI kod, ihtiyacınız olan nesnelere başvurular tutan bir yapı oluşturmak. Sen önce bir yapı oluşturmak, pointer long java dönmek. Sonra, java sadece bir parametre olarak long Bu konuda herhangi bir yöntemini çağırın, ve C yapı için bir işaretçi koyun.

Yapısı farklı JNI aramalar arasında temizlenene kadar yığını olacak.

EDİT: statik bir değişken olduğu adresi uzun Ao = (long)&address; kullanabilirsiniz sanmıyorum. Bu şekilde Gunslinger47 önerdi, yani kullanımı bir sınıf veya yapı birimi (new veya malloc kullanarak) yeni bir örnek oluşturun ve işaretçi geçirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • SRI International

    SRI Internat

    30 NİSAN 2008