another question , can there be uniform short array?
You can't specify different integers (byte, short, integer, long, etc.) but you can set the overall integer precision (but this is device specific...).
As of OpenGLES 3.0, you can do more with integers such as bit manipulation. So I could imagine you could store two shorts in a 32-bit integer variable. (idea can be extended to arrays, of course)
You'll need to make sure your renderer supports OpenGLES3.0 and the device also supports it (as well as bit manipulation).
another question , can a uniform array be longer than 1024 elements?
From my experience this is very device specific. Modern devices usually have allow for more than 256 uniform values.
That means that you should take around 240 as your uniform array size limit. (as other uniform variables are also counted for the device limit).