The GetStringUTFLength function returns the length as a jint (jsize) value and so is limited to returning at most Integer.MAX_VALUE. But a Java string can itself consist of Integer.MAX_VALUE characters, each of which may require more than one byte to represent them in modified UTF-8 format.** It follows then that this function cannot return the correct answer for all String values and yet the specification makes no mention of this, nor of any possible error to report if this situation is encountered.
**The modified UTF-8 format used by the VM can require up to six bytes to represent one unicode character, but six byte characters are stored as UTF16 surrogate pairs. Hence the most bytes per character is 3, and so the maximum length is 3*Integer.MAX_VALUE. With compact strings this reduces to 2*Integer.MAX_VALUE.
**The modified UTF-8 format used by the VM can require up to six bytes to represent one unicode character, but six byte characters are stored as UTF16 surrogate pairs. Hence the most bytes per character is 3, and so the maximum length is 3*Integer.MAX_VALUE. With compact strings this reduces to 2*Integer.MAX_VALUE.
- csr for
-
JDK-8338709 [JNI] The JNI Specification needs to address the limitations of integer UTF-8 String lengths
- Closed
- links to
-
Commit(master) openjdk/jdk/90f3f432
-
Review(master) openjdk/jdk/20784
1.
|
UTF8 lengths should be size_t not int | Resolved | David Holmes |