--- a/src/hotspot/share/prims/jni.cpp Mon Jun 04 22:03:10 2018 +0200
+++ b/src/hotspot/share/prims/jni.cpp Mon Jun 04 23:01:48 2018 +0200
@@ -2466,7 +2466,8 @@
if (buf != NULL) {
if (s_len > 0) {
if (!is_latin1) {
- memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len);
+ ArrayAccess<>::arraycopy_to_native(s_value, (size_t) typeArrayOopDesc::element_offset<jchar>(0),
+ buf, s_len);
} else {
for (int i = 0; i < s_len; i++) {
buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
@@ -2722,7 +2723,8 @@
result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
if (result != NULL) { \
/* copy the array to the c chunk */ \
- memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
+ ArrayAccess<>::arraycopy_to_native(a, typeArrayOopDesc::element_offset<ElementType>(0), \
+ result, len); \
if (isCopy) { \
*isCopy = JNI_TRUE; \
} \
@@ -2771,7 +2773,7 @@
int len = a->length(); \
if (len != 0) { /* Empty array: nothing to free or copy. */ \
if ((mode == 0) || (mode == JNI_COMMIT)) { \
- memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
+ ArrayAccess<>::arraycopy_from_native(buf, a, typeArrayOopDesc::element_offset<ElementType>(0), len); \
} \
if ((mode == 0) || (mode == JNI_ABORT)) { \
FreeHeap(buf); \
@@ -2822,10 +2824,7 @@
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
- memcpy((u_char*) buf, \
- (u_char*) src->Tag##_at_addr(start), \
- len << sc); \
+ ArrayAccess<>::arraycopy_to_native(src, typeArrayOopDesc::element_offset<ElementType>(start), buf, len); \
} \
} \
JNI_END
@@ -2872,10 +2871,7 @@
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
- int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
- memcpy((u_char*) dst->Tag##_at_addr(start), \
- (u_char*) buf, \
- len << sc); \
+ ArrayAccess<>::arraycopy_from_native(buf, dst, typeArrayOopDesc::element_offset<ElementType>(start), len); \
} \
} \
JNI_END
@@ -3111,7 +3107,8 @@
typeArrayOop s_value = java_lang_String::value(s);
bool is_latin1 = java_lang_String::is_latin1(s);
if (!is_latin1) {
- memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len);
+ ArrayAccess<>::arraycopy_to_native(s_value, typeArrayOopDesc::element_offset<jchar>(start),
+ buf, len);
} else {
for (int i = 0; i < len; i++) {
buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;