Abstract: A fuel injector performs a main injection and a pilot injection prior to the main injection. A fuel injection controller detects an ignition timing of a fuel injected at the main injection, detects a driving condition of the internal combustion engine, and varies a pilot injection quantity of the pilot injection when the driving condition is stable. Furthermore, the controller detects a variation in ignition timing due to a variation in the pilot injection quantity, and learns the pilot injection quantity based on the variation in ignition timing due to the variation in the pilot injection quantity.