CANlib works at the raw CAN frame level. This means the API can be used with any higher layer protocol like J1939, CanOpen, DeviceNet, etc. The work of packing/unpacking CAN frames into the particular higher layer protocol is left to your application code.
So when you write or read a CAN frame in CANlib, you will provide or receive the 11 or 29 bit identifier, the dlc, and the 0 to 8 data bytes. Your code will translate the identifier and data bytes based on the higher layer protocol you are using.