Whenever you call native code, you have to go via JNI. Typically, you need to build shared library. Calling schema follows (note that you don't call C file - it's just visualization of which method will be called):

So, in a sense, there is a file that contains source code of the library that you call.
In case of Windows, shared libraries are DLL
files in case of Linux they are typically so
files and in macOS dylib
. If you want to make them "visible" to your Java code, you have few options here. You can put location (directory where library is) in:
PATH
(windows)
LD_LIBRARY_PATH
(macOS/Linux)
-Djava.library.path
- work for all systems, it's just a jvm's argument.