I think they key difference can be found here:
While aspects define types that crosscut, the AspectJ system does not allow completely arbitrary crosscutting. Rather, aspects define types that cut across principled points in a program's execution. These principled points are called join points.
This means that join points are a well defined sets of places in the execution flow of your application code on which aspect advices can be applied (I.e. a pointcut (or more) placed). You can't just go apply pointcuts willy nilly in your code using AspectJ. The formal definition of the places where pointcuts can be applied are the join points.