Łączenie kodu Javy z kodem w C
description
Transcript of Łączenie kodu Javy z kodem w C
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Projekt ª¡czenie z VME
Jacek Bzdak
Wydziaª Fizyki PW
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Spis tre±ci
1 �¡czenie Javy i C/C++Po co nam toGranica mi¦dzy ±rodowiskami
2 Sposoby ª¡czeniaJNINowy sposóbOdwzorowaniaInne
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Po co nam to
Po co nam to?
Dobre powody:
Mamy jak¡± bibliotek¦ w C/C++ która na przykªadkomunikuje si¦ ze sprz¦tem i mamy w Javie ów sprz¦toprogramowa¢.
Trzeba pogada¢ z systemem operacyjnym
Zªe powody
Chcemy »eby nasz program byª szybszy. JVM jest ju» na tylewydajna »e ci¦»ko znale¹¢ kod który w C b¦dzie szybszy + s¡te» narzuty zwi¡zane z przej±ciem bariery: Java � C.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Po co nam to
Po co nam to?
Dobre powody:
Mamy jak¡± bibliotek¦ w C/C++ która na przykªadkomunikuje si¦ ze sprz¦tem i mamy w Javie ów sprz¦toprogramowa¢.
Trzeba pogada¢ z systemem operacyjnym
Zªe powody
Chcemy »eby nasz program byª szybszy. JVM jest ju» na tylewydajna »e ci¦»ko znale¹¢ kod który w C b¦dzie szybszy + s¡te» narzuty zwi¡zane z przej±ciem bariery: Java � C.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Po co nam to
Po co nam to?
Dobre powody:
Mamy jak¡± bibliotek¦ w C/C++ która na przykªadkomunikuje si¦ ze sprz¦tem i mamy w Javie ów sprz¦toprogramowa¢.
Trzeba pogada¢ z systemem operacyjnym
Zªe powody
Chcemy »eby nasz program byª szybszy. JVM jest ju» na tylewydajna »e ci¦»ko znale¹¢ kod który w C b¦dzie szybszy + s¡te» narzuty zwi¡zane z przej±ciem bariery: Java � C.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Po co nam to
Po co nam to?
Dobre powody:
Mamy jak¡± bibliotek¦ w C/C++ która na przykªadkomunikuje si¦ ze sprz¦tem i mamy w Javie ów sprz¦toprogramowa¢.
Trzeba pogada¢ z systemem operacyjnym
Zªe powody
Chcemy »eby nasz program byª szybszy. JVM jest ju» na tylewydajna »e ci¦»ko znale¹¢ kod który w C b¦dzie szybszy + s¡te» narzuty zwi¡zane z przej±ciem bariery: Java � C.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Po co nam to
Po co nam to?
Dobre powody:
Mamy jak¡± bibliotek¦ w C/C++ która na przykªadkomunikuje si¦ ze sprz¦tem i mamy w Javie ów sprz¦toprogramowa¢.
Trzeba pogada¢ z systemem operacyjnym
Zªe powody
Chcemy »eby nasz program byª szybszy. JVM jest ju» na tylewydajna »e ci¦»ko znale¹¢ kod który w C b¦dzie szybszy + s¡te» narzuty zwi¡zane z przej±ciem bariery: Java � C.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica
Generalnie przej±cie mi¦dzy kodem wykonywanym napisanym wdwóch j¦zykach jest kªopotliwe wynika to z:
Mo»liwej innej reprezentacji typów wbudowanych.
Po obu stronach mog¡ istnie¢ ró»ne typy wbudowane (Java nieu»ywa typów unsigned)
Innej pami¦ciowej reprezetacji typów zªo»onych � tablice Javypami¦taj¡ swój rozmiar (rombn¡¢ mo»e si¦ te» np. bytealignment stuktur)
Ró»nego zarz¡dzania pami¦ci¡ � po stronie Javy pami¦¢ jestzarz¡dzana przez GC, po stronie C przez programiste. GC niemo»e wiedzie¢ co kod C robi z pami¦ci¡ (ten sam problem jestprzy wi¡zaniu .Net � C)
Ró»ne procesy mog¡ mie¢ ró»ne prawa dost¦pu do pami¦ci...
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica cd.
Tak na prawd¦ sprowadza si¦ to do jednej rzeczy:
Wszystkie zmienne musz¡ by¢ kopiowane przy przej±ciu zjednej strony na drug¡
Powoduje to pewne narzuty
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica cd.
Tak na prawd¦ sprowadza si¦ to do jednej rzeczy:
Wszystkie zmienne musz¡ by¢ kopiowane przy przej±ciu zjednej strony na drug¡
Powoduje to pewne narzuty
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Granica mi¦dzy ±rodowiskami
Granica cd.
Tak na prawd¦ sprowadza si¦ to do jednej rzeczy:
Wszystkie zmienne musz¡ by¢ kopiowane przy przej±ciu zjednej strony na drug¡
Powoduje to pewne narzuty
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
JNI
W JVM wbudowany jest mechanizm JNI (Java Native Interface).Pozwala on zadekrarowanie funkcji jako native i dostarczenie ichde�nicji w postaci skompilowanej biblioteki napisanej w C/C++.
Zalety JNI:
Jest do±¢ dobrze wyspecy�kowana i kod bibliotek JNI jestprzeno±ny mi¦dzy maszynami wirtualnymi Java.
Mo»na si¦ dogada¢ z kodem C++
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
JNI
W JVM wbudowany jest mechanizm JNI (Java Native Interface).Pozwala on zadekrarowanie funkcji jako native i dostarczenie ichde�nicji w postaci skompilowanej biblioteki napisanej w C/C++.Zalety JNI:
Jest do±¢ dobrze wyspecy�kowana i kod bibliotek JNI jestprzeno±ny mi¦dzy maszynami wirtualnymi Java.
Mo»na si¦ dogada¢ z kodem C++
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
JNI
W JVM wbudowany jest mechanizm JNI (Java Native Interface).Pozwala on zadekrarowanie funkcji jako native i dostarczenie ichde�nicji w postaci skompilowanej biblioteki napisanej w C/C++.Zalety JNI:
Jest do±¢ dobrze wyspecy�kowana i kod bibliotek JNI jestprzeno±ny mi¦dzy maszynami wirtualnymi Java.
Mo»na si¦ dogada¢ z kodem C++
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Wady JNI
Wady JNI:
Trzeba pisa¢ kod w C/C++
Interfejsy (by by¢ przeno±nymi) s¡ skomplikowane.
Mo»na zabi¢ JVM.
Mo»na zacz¡¢ gubi¢ pami¦¢
Przy u»ywaniu kodu Javy na wielu systemach trzeba bibliotekiJNI kompilowa¢ na wiele systemów � masakra logistyczna
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI � Java
Tak pogl¡dowo pisze :)Po stronie Javy:
package pkg;
class Cls {
static{
System.loadLibrary(�libName�);
}
native double f(int i, String s);
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI � C
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (
JNIEnv *env,
jobject obj,
jint i,
jstring s){
const char *str =
( *env)->GetStringUTFChars(env, s, 0);
/* process the string */
...
/* Now we are done with str */
( *env)->ReleaseStringUTFChars(env, s, str);
return ...
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI � C
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (
JNIEnv *env,
jobject obj,
jint i,
jstring s){
const char *str =
( *env)->GetStringUTFChars(env, s, 0);
/* process the string */
...
/* Now we are done with str */
( *env)->ReleaseStringUTFChars(env, s, str);
return ...
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI � C
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (
JNIEnv *env,
jobject obj,
jint i,
jstring s){
const char *str =
( *env)->GetStringUTFChars(env, s, 0);
/* process the string */
...
/* Now we are done with str */
( *env)->ReleaseStringUTFChars(env, s, str);
return ...
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI � C
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (
JNIEnv *env,
jobject obj,
jint i,
jstring s){
const char *str =
( *env)->GetStringUTFChars(env, s, 0);
/* process the string */
...
/* Now we are done with str */
( *env)->ReleaseStringUTFChars(env, s, str);
return ...
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
JNI
Kod JNI
Generalnie zªo!
R¦cznie trzeba przepakowywa¢ wszystkie obiekty � ªatwo obª¡d zabijaj¡cy JVM
Dobieranie si¦ do pól i metod jest wymaga jeszcze wi¦kszejilo±ci kodu
Dla uczciwo±ci dodam »e:
S¡ narz¦dzia Javy pozwalaj¡ce generowa± same deklaracje tychfunkcji
S¡ narz¦dzia (pono¢) które s¡ w stanie generowa¢ caªemapowania
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
JNA
JNA to biblioteka Javy która bardzo uªatwia wi¡zanie Javy i C.
Wady:
Obsªuguje tylko C (nie C++)
Wymaga posiadania dynamicznych bibliotek (w mojej pracyin»ynierskiej musiaªem konwertowa¢ r¦cznie statycznego libana dynamicznego)
S¡ wi¦ksze narzuty na wywoªanie � nieistotne!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
JNA
JNA to biblioteka Javy która bardzo uªatwia wi¡zanie Javy i C.Wady:
Obsªuguje tylko C (nie C++)
Wymaga posiadania dynamicznych bibliotek (w mojej pracyin»ynierskiej musiaªem konwertowa¢ r¦cznie statycznego libana dynamicznego)
S¡ wi¦ksze narzuty na wywoªanie � nieistotne!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
JNA
JNA to biblioteka Javy która bardzo uªatwia wi¡zanie Javy i C.Wady:
Obsªuguje tylko C (nie C++)
Wymaga posiadania dynamicznych bibliotek (w mojej pracyin»ynierskiej musiaªem konwertowa¢ r¦cznie statycznego libana dynamicznego)
S¡ wi¦ksze narzuty na wywoªanie � nieistotne!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
JNA
JNA to biblioteka Javy która bardzo uªatwia wi¡zanie Javy i C.Wady:
Obsªuguje tylko C (nie C++)
Wymaga posiadania dynamicznych bibliotek (w mojej pracyin»ynierskiej musiaªem konwertowa¢ r¦cznie statycznego libana dynamicznego)
S¡ wi¦ksze narzuty na wywoªanie � nieistotne!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
JNA
JNA to biblioteka Javy która bardzo uªatwia wi¡zanie Javy i C.Wady:
Obsªuguje tylko C (nie C++)
Wymaga posiadania dynamicznych bibliotek (w mojej pracyin»ynierskiej musiaªem konwertowa¢ r¦cznie statycznego libana dynamicznego)
S¡ wi¦ksze narzuty na wywoªanie � nieistotne!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
Zalety
Zalety:
Zero kodu w C
Samo pilnuje pami¦ci w 90% wypadków
Umie mapowa¢ skomplikowane typy � struktury
S¡ narz¦dzia do automatycznego generowania sygnatur funkcjiw Javie. Ja ich nie lubie bo cz¦sto funkcja jest niejednoznaczna (co znaczy void *, czy int* to wska¹nik na intczy tablica?), ale ludzie u»ywaj¡ z powodzeniem.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
Zalety
Zalety:
Zero kodu w C
Samo pilnuje pami¦ci w 90% wypadków
Umie mapowa¢ skomplikowane typy � struktury
S¡ narz¦dzia do automatycznego generowania sygnatur funkcjiw Javie. Ja ich nie lubie bo cz¦sto funkcja jest niejednoznaczna (co znaczy void *, czy int* to wska¹nik na intczy tablica?), ale ludzie u»ywaj¡ z powodzeniem.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
Zalety
Zalety:
Zero kodu w C
Samo pilnuje pami¦ci w 90% wypadków
Umie mapowa¢ skomplikowane typy � struktury
S¡ narz¦dzia do automatycznego generowania sygnatur funkcjiw Javie. Ja ich nie lubie bo cz¦sto funkcja jest niejednoznaczna (co znaczy void *, czy int* to wska¹nik na intczy tablica?), ale ludzie u»ywaj¡ z powodzeniem.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
Zalety
Zalety:
Zero kodu w C
Samo pilnuje pami¦ci w 90% wypadków
Umie mapowa¢ skomplikowane typy � struktury
S¡ narz¦dzia do automatycznego generowania sygnatur funkcjiw Javie. Ja ich nie lubie bo cz¦sto funkcja jest niejednoznaczna (co znaczy void *, czy int* to wska¹nik na intczy tablica?), ale ludzie u»ywaj¡ z powodzeniem.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Nowy sposób
Zalety
Zalety:
Zero kodu w C
Samo pilnuje pami¦ci w 90% wypadków
Umie mapowa¢ skomplikowane typy � struktury
S¡ narz¦dzia do automatycznego generowania sygnatur funkcjiw Javie. Ja ich nie lubie bo cz¦sto funkcja jest niejednoznaczna (co znaczy void *, czy int* to wska¹nik na intczy tablica?), ale ludzie u»ywaj¡ z powodzeniem.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Odwzorowania � typy proste
C java C java
byte/unsigned byte byte struct Structureint/unisgned int int whatever* Pointer
long/unsigned long NativeLong array java array�oat/double �oat/double by reverence xxxByReference
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Mapowanie nazw funkcji
C czasem dekoruje nazwy funkcji. Na przykªad z foo potra�zrobi¢ @foo@64, gdzie 64 to dªugo±¢ pami¦ci zajmowanej przezargumenty
�eby wywoªa¢ funkcje musimy mie¢ jej udekorowan¡ nazwe.
JNI radzi sobie z tym za pomoc¡ rozwi¡za« C
JNA ma do tego mechanizm FunctionMapper � to jest takieco± co dostaje java.re�ect.Method i ma z tego zgadn¡¢ nazw¦metody w C
S¡ implementacje FunctionMappera na wi¦szko±¢ dekoracji nawi¦kszo±¢ systemów
Najlepiej (jak si¦ da) wyª¡czy¢ dekorowanie
Mo»na u»y¢ FunctionMappera do tego »eby pozby¢ si¦ tychdziwnych pre�xów funkcji. Np. SADGetParameter
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA
static{
Native.register(CaenUtils.createNativeLib());
}
public native int Init(int BdType, short link,
short bdNum, IntByReference handle);
public native int WriteCycle(int handle,
int address, byte[] data)
public int ReadCycle(int handle,
int address,
IntByReference data)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA
static{
Native.register(CaenUtils.createNativeLib());
}
public native int Init(int BdType, short link,
short bdNum, IntByReference handle);
public native int WriteCycle(int handle,
int address, byte[] data)
public int ReadCycle(int handle,
int address,
IntByReference data)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA
static{
Native.register(CaenUtils.createNativeLib());
}
public native int Init(int BdType, short link,
short bdNum, IntByReference handle);
public native int WriteCycle(int handle,
int address, byte[] data)
public int ReadCycle(int handle,
int address,
IntByReference data)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA
static{
Native.register(CaenUtils.createNativeLib());
}
public native int Init(int BdType, short link,
short bdNum, IntByReference handle);
public native int WriteCycle(int handle,
int address, byte[] data)
public int ReadCycle(int handle,
int address,
IntByReference data)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA2
public static Map<String, Object> createLibOptions(){
Map<String, Object> result = (...)
result.put(Library.OPTION_FUNCTION_MAPPER,
new CaenFunctionMapper());
return result;
}
public static NativeLibrary createNativeLib(){
return NativeLibrary.getInstance("CAENVME",
createLibOptions());
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Kod JNA2
public static Map<String, Object> createLibOptions(){
Map<String, Object> result = (...)
result.put(Library.OPTION_FUNCTION_MAPPER,
new CaenFunctionMapper());
return result;
}
public static NativeLibrary createNativeLib(){
return NativeLibrary.getInstance("CAENVME",
createLibOptions());
}
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Zarz¡dzanie pami¦ci¡
Jak pisaªem � przy przej±ciu przez granic¦ pami¦c jestkopiowana
Pami¦¢ allokowana przez JNA jest kasowana przy wyj±ciu zfunkcji. W 90% wypadków jest to porz¡dana cecha.
Mo»na u»y¢ klasy Memory by przekaza¢ do kodu natywnegopami¦¢ która b¦dzie zaalokowana a» dana instancja Memorynie tra� do GC.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Zarz¡dzanie pami¦ci¡
Jak pisaªem � przy przej±ciu przez granic¦ pami¦c jestkopiowana
Pami¦¢ allokowana przez JNA jest kasowana przy wyj±ciu zfunkcji. W 90% wypadków jest to porz¡dana cecha.
Mo»na u»y¢ klasy Memory by przekaza¢ do kodu natywnegopami¦¢ która b¦dzie zaalokowana a» dana instancja Memorynie tra� do GC.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Zarz¡dzanie pami¦ci¡
Jak pisaªem � przy przej±ciu przez granic¦ pami¦c jestkopiowana
Pami¦¢ allokowana przez JNA jest kasowana przy wyj±ciu zfunkcji. W 90% wypadków jest to porz¡dana cecha.
Mo»na u»y¢ klasy Memory by przekaza¢ do kodu natywnegopami¦¢ która b¦dzie zaalokowana a» dana instancja Memorynie tra� do GC.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Mamy funkcje
void writeToMem(void *, int)
Odwzorowan¡ na:
void writeMem(byte[], int)
i wywoªan¡:
byte[] res = new byte[256]
writeMem(res, 256)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Mamy funkcje
void writeToMem(void *, int)
Odwzorowan¡ na:
void writeMem(byte[], int)
i wywoªan¡:
byte[] res = new byte[256]
writeMem(res, 256)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Mamy funkcje
void writeToMem(void *, int)
Odwzorowan¡ na:
void writeMem(byte[], int)
i wywoªan¡:
byte[] res = new byte[256]
writeMem(res, 256)
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Przykªad
Co si¦ dzieje z pami¦ci¡:
Po stronie Javy allokujemy 256 bajtów
Tworzona jest tablica C o dªugo±ci 256 (dªugo±¢ brana z polalength)
przekazywana ona jest do funkcji C
po wykonaniu funkcji zawarto±¢ tablicy z C kopiowana jest dotablicy Java
Tablica C jest kasowana
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Problemy z JNA
Jest problem z unsigned byte
Czasem trzeba pilnowa¢ byte alignmentu struktur
Uwa»a¢ na w¡tki (jak w JNI)!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Problemy z JNA
Jest problem z unsigned byte
Czasem trzeba pilnowa¢ byte alignmentu struktur
Uwa»a¢ na w¡tki (jak w JNI)!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Problemy z JNA
Jest problem z unsigned byte
Czasem trzeba pilnowa¢ byte alignmentu struktur
Uwa»a¢ na w¡tki (jak w JNI)!
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Wydajno±¢
Autorzy mówi¡ »e wydajno±¢ zaprezentowanej metodywywoªywania funckcji jest 2 - 3 razy mniejsza ni» dla JNI.
Dotyczy to narzutu na wywoªanie funkcji, samo wykonaniefunkcji jest tak samo szybkie :) Dla dªugo trwaj¡cych funkcjinarzut jest nieistotny.
Jest druga metoda wywoªywania (historycznie wcze±niejsza)maj¡ca narzut wi¦kszy o rz¡d wielko±ci. Ale s¡ rzeczy zktórymi pierwsza metoda sobie nie radzi (do±¢ egzotyczne �np. tablice wska¹ników)
Nie zauwa»yªem wielkiego wpªywu tego narzutu na wykonanie.Kiedy gadamy ze sprz¦tem i tak najwolniejsza jest samakomunikacja.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Wydajno±¢
Autorzy mówi¡ »e wydajno±¢ zaprezentowanej metodywywoªywania funckcji jest 2 - 3 razy mniejsza ni» dla JNI.
Dotyczy to narzutu na wywoªanie funkcji, samo wykonaniefunkcji jest tak samo szybkie :) Dla dªugo trwaj¡cych funkcjinarzut jest nieistotny.
Jest druga metoda wywoªywania (historycznie wcze±niejsza)maj¡ca narzut wi¦kszy o rz¡d wielko±ci. Ale s¡ rzeczy zktórymi pierwsza metoda sobie nie radzi (do±¢ egzotyczne �np. tablice wska¹ników)
Nie zauwa»yªem wielkiego wpªywu tego narzutu na wykonanie.Kiedy gadamy ze sprz¦tem i tak najwolniejsza jest samakomunikacja.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Wydajno±¢
Autorzy mówi¡ »e wydajno±¢ zaprezentowanej metodywywoªywania funckcji jest 2 - 3 razy mniejsza ni» dla JNI.
Dotyczy to narzutu na wywoªanie funkcji, samo wykonaniefunkcji jest tak samo szybkie :) Dla dªugo trwaj¡cych funkcjinarzut jest nieistotny.
Jest druga metoda wywoªywania (historycznie wcze±niejsza)maj¡ca narzut wi¦kszy o rz¡d wielko±ci. Ale s¡ rzeczy zktórymi pierwsza metoda sobie nie radzi (do±¢ egzotyczne �np. tablice wska¹ników)
Nie zauwa»yªem wielkiego wpªywu tego narzutu na wykonanie.Kiedy gadamy ze sprz¦tem i tak najwolniejsza jest samakomunikacja.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Odwzorowania
Wydajno±¢
Autorzy mówi¡ »e wydajno±¢ zaprezentowanej metodywywoªywania funckcji jest 2 - 3 razy mniejsza ni» dla JNI.
Dotyczy to narzutu na wywoªanie funkcji, samo wykonaniefunkcji jest tak samo szybkie :) Dla dªugo trwaj¡cych funkcjinarzut jest nieistotny.
Jest druga metoda wywoªywania (historycznie wcze±niejsza)maj¡ca narzut wi¦kszy o rz¡d wielko±ci. Ale s¡ rzeczy zktórymi pierwsza metoda sobie nie radzi (do±¢ egzotyczne �np. tablice wska¹ników)
Nie zauwa»yªem wielkiego wpªywu tego narzutu na wykonanie.Kiedy gadamy ze sprz¦tem i tak najwolniejsza jest samakomunikacja.
�¡czenie Javy i C/C++ Sposoby ª¡czenia
Inne
Inne narz¦dzia
SWIG � pozwala si¦ ª¡czy¢ z kodem napisanym w podzbiorzeC++ (nie lubi szablonów)
CORBA i inne podobne � ale to zªo. Zªo i jeszcze raz zuo.
S¡ te» pªatne rozwi¡znia