I'm not familiar with C# or the OpenCL .NET bindings. But I assume that this "pinning" refers to C#-Objects which are passed to OpenCL for copying them into a buffer. For example, roughly like
int someArray = new int;
clEnqueueWriteBuffer (queue, mem, true, 0,n, **someArray**, 0,null,null);
to avoid the 'someArray' being moved or GC'ed while OpenCL is copying it?
For blocking read- or write-operations, this is not necessary in JOCL. The array will be pinned internally on native side, if this is possible. In most other Java bindings for native libraries, the data may only be passed to the native side using direct buffers (see ByteBuffer#allocateDirect), but in JOCL, it is also possible to simply use the arrays. Again, this only refers to blocking operations.
For non-blocking operations, some difficulties may arise, because the data may be GC'ed before it can be pinned. At the moment, the respective functions will throw an Exception when there is an attempt to use something else than a direct buffer for a non-blocking operation. In most cases, this should not be a problem. However, I'm already working to also support non-blocking operations on non-direct data - I think the new functions that have been introduced with OpenCL 1.1 should make this possible, although I have not yet done specific tests.