Generally, you should always first try to detect where your actual performance bottleneck is and what your performance is currently bound by:
- you could be Java/CPU bound by some calculations you are doing in Java
- you could be driver call / JNI bound
- you could be vertex transform bound
- you could be shader instruction overhead bound
- you could be fillrate/ROP bound
I suspect the second.
In your case, try using Uniform Buffer Objects (i.e. uniforms whose memory is baked by buffer objects) to reduce the number of OpenGL/JNI calls to update the uniforms.
With UBO you would just update the light properties in a simple ByteBuffer and then upload that once for each frame.
That should give you better performance, as I suspect JNI calls to be your bottleneck.
Every type of bottleneck can be tested, though. For example, you can test whether you are driver/JNI bound, by just adding more JNI calls, such as redundant glUniform* calls and see whether the framerate drops significantly.
Likewise being shader instruction overhead (in the fragment shader) and fillrate limited can be tested by reducing the resolution of your framebuffer/window.
I don't think you are shader instruction overhead limited with your shader.