Java JNI - sdružuje prostředky přidělené v jazyce C s java objekty?

hlasů
7

Chci přidělit část paměti v jazyce C a udržovat ji spojený s instanci java objektu, například takto:

void configure(JNIEnv *object, jobject obj, ....) {
  char *buf = new char[1024];
  // associated <buf> with <obj> somehow
}

A později uvolnit paměť, pokud je objekt java dostane do koše - nemohl jsem to tím, že volání funkce JNI ze dokončit () metodu objektu java.

Otázkou je, jak mohu spojovat C ukazatel s objektem java? Udržujte dlouhé pole v objektu a obsazení ukazatel dlouho ? Existuje lepší způsob?

Položena 04/01/2010 v 08:54
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
16

Obecně platí, že pokud chcete přenést ukazatel z C k Javě, je doporučeno použít longtak, že existuje dostatek bitů držet hodnota ukazatele v případě, že platforma je 64 bitů.

Potom se podívejte na ByteBuffer.allocateDirect()který vytvoří ByteBufferinstanci, která paměť může být sdílená s C. můžete přidělit taková přímá ByteBufferze strany Java pak předat jej jako jobjectna funkci JNI a uvnitř této funkce JNI budete používat GetDirectBufferAddressfunkci.

Dalším způsobem, jak je zabalit nativní oblast paměti s NewDirectByteBufferfunkcí JNI z nativního strany. To vám dává jobjectpředáte zpět na stranu Java (pozor na lokální a globální reference). Dávejte pozor na to, že jakmile je přímá ByteBufferkterý obtéká nativní paměť byla vytvořena, budete i nadále zodpovědní za správu nativní paměti: v určitém okamžiku budete muset volat delete buf;v nativním kódu, Java nebude to pro vás ,

Odpovězeno 04/01/2010 v 10:27
zdroj uživatelem

hlasů
0

Java nemá žádnou představu o nativní ukazatele, takže uložením jako dlouho je jedinou reálnou možností. Ale neměli byste spoléhat na finalizeuvolnit ukazatel; metoda finalizace nespolehlivý jako prostředek k vyčištění zdrojů. Viz tuto otázku pro další podrobnosti.

Odpovězeno 04/01/2010 v 10:24
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more