それは確かに珍しいことではありません。
Python 標準ライブラリの多くの部分は C で記述されており、numpy などの多くの一般的なサードパーティ ライブラリには C で記述された部分があり、ctypes を使用して独自の C ライブラリへのバインドを作成できます。Python のデフォルト GUI ライブラリ Tkinter の一部は、Tcl/Tk で記述されています。
Java には Java Native Interface (JNI) があり、Java 仮想マシンではなく物理マシンを対象として記述されたモジュールを統合するために使用できます。Scala は JVM 用に作成されたライブラリ (もちろん Java で作成されたものも含む) を使用でき、JNI も使用できます。
ほとんどの大規模なソフトウェアは、複数の言語で記述されています。通常は 2 つの言語が使用されます。1 つはパフォーマンス クリティカル セクション用の高速なコンパイル済み言語 (通常は C または C++) で、もう 1 つは複雑だがパフォーマンス クリティカルではない部分を記述するためのスクリプト言語 (Python、Lisp、Lua など) です。
どの言語でも対話できるようにするには、2 つの要件があります。1 つは、相互に理解できる形式でメモリ内データを共有できる必要があること、2 つ目は、共通の「呼び出し規約」を使用して互いの関数を呼び出せる必要があることです。ネイティブ インターフェイス ライブラリは、これらの問題を解決します。