I've never done any JNI and don't know much about native methods. However, native code will not honor Java's synchronization, so any native method that could potentially be interfering with another thread must be called from within a proper sync block, so that the method isn't invoked until the lock is obtained.
clone() is not thread-safe. All it does is basically memcpy the fields of the object. It is up to your program to make clone() safe if your class is designed for concurrent use.
Native code that accesses shared objects must either use the JNI monitor methods were appropriate or else only be called with the appropriate locks held at the Java level. Note that native methods can be declared synchronized.