Gay*_*tti 5 java string jvm jnienv java-10
我正在开发一个代码库,它使用JNI技术来构建本机方法.
以下是用于的本机对等方法的段 java.lang.String#equals(Object)
@MJI
public boolean equals__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int argRef) {
ElementInfo s1 = heap.get(objRef); // this
ElementInfo s2 = heap.get(argRef);
Fields f1 = heap.get(s1.getField("value")).getFields();
Fields f2 = heap.get(s2.getField("value")).getFields();
char[] c1 = ((CharArrayFields) f1).asCharArray();
char[] c2 = ((CharArrayFields) f2).asCharArray();
Run Code Online (Sandbox Code Playgroud)
这在Java 8上运行良好.但是在Java 9及更高版本中,valueString字段返回的值是char[]或者byte[]
我希望它返回一个byte []数组,因为在JEP 254:Compact Strings中进行了更改
例如:
char[] chars = new char[] {'a','b','c', 'd'};
String str1 = new String(chars))
"str2".equals(str1);
Run Code Online (Sandbox Code Playgroud)
在这里,我在对等方法中获取了char数组str1和字节数组"str2".这是因为字符串在堆中的存储方式不同吗?
供参考:
这是我正在实际工作的代码.我正在尝试使用Java 9及更高版本:
JPF核/ SRC /对等方/ GOV/NASA/JPF/VM/JPF_java_lang_String.java#L166-L200
正如你可能看到的那样,valueField有人向CharArrayFields施展.但是当在Java"10.0.1"上运行时,valueField有时是CharArrayFields,有时候是ByteArrayFields.