private native int foo(double bar);
Tak więc, w końcu to musi wywołać funkcję C++ dla jego implementacji. W szczególności będzie to skończyć wywołanie funkcji z czymś nazwy takie jak:
Java_MyClass_foo
Co się stanie, jeśli istnieje wiele metod natywnych Foo z różnych podpisów? Komplikacje. Jeśli to zrobisz, Java doda informacje o typie do nazwy szukanej metody. Ale po prostu łatwiej jest trzymać się metod nieprzeciążonych.
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
foo0
nadano unikalną nazwę, nigdy nie powinno być powodem, aby dodać kolejną foo0
. Dzięki temu implementacja C++ staje się prosta, nigdy nie ma do czynienia z zniekształconymi nazwami. Nawet jeśli foo ostatecznie zyska przeciążenie, zadzwoni pod numer foo1
zamiast foo0
, a implementacja JNI C++ nie będzie musiała radzić sobie z dodatkowymi komplikacjami przeciążania.
Dobre pytanie. Musiałbyś zapytać projektantów języka. Być może kiedy zaprojektowano niektóre z wczesnych bibliotek, nie zdecydowano jeszcze, czy możliwe będzie zastąpienie natywnej metody. Tylko zgaduję. –
Definiowanie "wielu" jest subiektywne. – Raedwald
Jako ktoś, kto napisał dużo kodu JNI, muszę powiedzieć, że używam tego samego wzoru konsekwentnie - last but not least, fajnie jest szybko dodać trochę 'System.out.println (" Metoda jest wywoływana, więc dlaczego heck nie działa!?!?! ");' w części Java, bez konieczności przekompilowania natywnego kodu. – Marco13