2
0
mirror of https://github.com/HDFGroup/hdf5.git synced 2025-04-24 17:51:25 +08:00

Merge pull request in HDFFV/hdf5 from ~BYRN/hdf5_adb:develop to develop

* commit '4c1e89fba31abb357a05044c3f6a92450dfb753c':
  Fix attribute Read
This commit is contained in:
Allen Byrne 2018-06-26 09:03:14 -05:00
commit 4095b9260d
6 changed files with 457 additions and 244 deletions

@ -1025,8 +1025,11 @@ class ArrayDescriptor {
NTsize = 8;
}
else if (css.startsWith("Ljava.lang.String")) {
NT = 'L';
className = "java.lang.String";
NTsize = 1;
throw new HDF5JavaException(new String(
"ArrayDesciptor: Error: String array not supported yet"));
"ArrayDesciptor: Warning: String array not fully supported yet"));
}
else {
/*

@ -49,6 +49,10 @@ extern jobject visit_callback;
/* Local Prototypes */
/********************/
static herr_t H5AwriteVL_asstr (JNIEnv *env, hid_t attr_id, hid_t mem_id, jobjectArray buf);
static herr_t H5AwriteVL_str (JNIEnv *env, hid_t attr_id, hid_t mem_id, jobjectArray buf);
static herr_t H5AreadVL_asstr (JNIEnv *env, hid_t attr_id, hid_t mem_id, jobjectArray buf);
static herr_t H5AreadVL_str (JNIEnv *env, hid_t attr_id, hid_t mem_id, jobjectArray buf);
static herr_t H5A_iterate_cb(hid_t g_id, const char *name, const H5A_info_t *info, void *op_data);
@ -178,7 +182,6 @@ Java_hdf_hdf5lib_H5_H5Aread
} /* end if */
else {
status = H5Aread((hid_t)attr_id, (hid_t)mem_type_id, byteP);
if (status < 0) {
ENVPTR->ReleaseByteArrayElements(ENVPAR buf, byteP, JNI_ABORT);
h5libraryError(env);
@ -192,6 +195,323 @@ Java_hdf_hdf5lib_H5_H5Aread
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Aread */
/*
* Class: hdf_hdf5lib_H5
* Method: H5AwriteVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AwriteVL
(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
{
herr_t status = -1;
htri_t isStr = 0;
htri_t isVlenStr = 0;
htri_t isComplex = 0;
if (buf == NULL) {
h5nullArgument(env, "H5AwriteVL: buf is NULL");
} /* end if */
else {
isStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
if (H5Tget_class((hid_t)mem_type_id) == H5T_COMPOUND) {
unsigned i;
int nm = H5Tget_nmembers(mem_type_id);
for(i = 0; i <nm; i++) {
hid_t nested_tid = H5Tget_member_type((hid_t)mem_type_id, i);
isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND) ||
H5Tdetect_class((hid_t)nested_tid, H5T_VLEN);
H5Tclose(nested_tid);
}
}
else if (H5Tget_class((hid_t)mem_type_id) == H5T_VLEN) {
isVlenStr = 1; /* strings created by H5Tvlen_create(H5T_C_S1) */
}
if (isStr == 0 || isComplex>0 || isVlenStr) {
status = H5AwriteVL_asstr(env, (hid_t)attr_id, (hid_t)mem_type_id, buf);
}
else if (isStr > 0) {
status = H5AwriteVL_str(env, (hid_t)attr_id, (hid_t)mem_type_id, buf);
}
} /* end else */
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Awrite_1VL */
herr_t
H5AwriteVL_str
(JNIEnv *env, hid_t aid, hid_t tid, jobjectArray buf)
{
herr_t status = -1;
char **wdata;
jsize size;
jint i;
size = ENVPTR->GetArrayLength(ENVPAR (jarray) buf);
wdata = (char**)HDcalloc((size_t)size + 1, sizeof(char*));
if (!wdata) {
h5JNIFatalError(env, "H5AwriteVL_str: cannot allocate buffer");
} /* end if */
else {
HDmemset(wdata, 0, (size_t)size * sizeof(char*));
for (i = 0; i < size; ++i) {
jstring obj = (jstring) ENVPTR->GetObjectArrayElement(ENVPAR (jobjectArray) buf, i);
if (obj != 0) {
jsize length = ENVPTR->GetStringUTFLength(ENVPAR obj);
const char *utf8 = ENVPTR->GetStringUTFChars(ENVPAR obj, 0);
if (utf8) {
wdata[i] = (char*)HDmalloc((size_t)length + 1);
if (wdata[i]) {
HDmemset(wdata[i], 0, ((size_t)length + 1));
HDstrncpy(wdata[i], utf8, (size_t)length);
} /* end if */
} /* end if */
ENVPTR->ReleaseStringUTFChars(ENVPAR obj, utf8);
ENVPTR->DeleteLocalRef(ENVPAR obj);
} /* end if */
} /* end for (i = 0; i < size; ++i) */
status = H5Awrite((hid_t)aid, (hid_t)tid, wdata);
for (i = 0; i < size; i++) {
if(wdata[i]) {
HDfree(wdata[i]);
} /* end if */
} /* end for */
HDfree(wdata);
if (status < 0)
h5libraryError(env);
} /* end else */
return (jint)status;
}
herr_t
H5AwriteVL_asstr
(JNIEnv *env, hid_t aid, hid_t tid, jobjectArray buf)
{
char **strs;
jstring jstr;
jint i;
jint n;
hid_t sid;
hsize_t dims[H5S_MAX_RANK];
herr_t status = -1;
n = ENVPTR->GetArrayLength(ENVPAR buf);
strs =(hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t));
if (strs == NULL) {
h5JNIFatalError(env, "H5AwriteVL_asstr: failed to allocate buff for read variable length strings");
} /* end if */
else {
status = H5Awrite(aid, tid, strs);
if (status < 0) {
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, strs);
H5Sclose(sid);
HDfree(strs);
h5JNIFatalError(env, "H5AwriteVL_str: failed to read variable length strings");
} /* end if */
else {
for (i=0; i < n; i++) {
jstr = ENVPTR->NewStringUTF(ENVPAR strs[i]);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
H5free_memory (strs[i]);
} /* end for */
/*
for repeatedly reading a dataset with a large number of strs (e.g., 1,000,000 strings,
H5Dvlen_reclaim() may crash on Windows because the Java GC will not be able to collect
free space in time. Instead, use "H5free_memory(strs[i])" above to free individual strings
after it is done.
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, strs);
*/
HDfree(strs);
} /* end else */
} /* end else */
return status;
} /* end H5AwriteVL_str */
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadVL
* Signature: (JJJJJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AreadVL
(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
{
herr_t status = -1;
htri_t isStr = 0;
htri_t isVlenStr = 0;
htri_t isComplex = 0;
if (buf == NULL) {
h5nullArgument(env, "H5AreadVL: buf is NULL");
} /* end if */
else {
isStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
if (H5Tget_class((hid_t)mem_type_id) == H5T_COMPOUND) {
unsigned i;
int nm = H5Tget_nmembers(mem_type_id);
for(i = 0; i <nm; i++) {
hid_t nested_tid = H5Tget_member_type((hid_t)mem_type_id, i);
isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND) ||
H5Tdetect_class((hid_t)nested_tid, H5T_VLEN);
H5Tclose(nested_tid);
}
}
else if (H5Tget_class((hid_t)mem_type_id) == H5T_VLEN) {
isVlenStr = 1; /* strings created by H5Tvlen_create(H5T_C_S1) */
}
if (isStr == 0 || isComplex>0 || isVlenStr) {
status = H5AreadVL_asstr(env, (hid_t)attr_id, (hid_t)mem_type_id, buf);
}
else if (isStr > 0) {
status = H5AreadVL_str(env, (hid_t)attr_id, (hid_t)mem_type_id, buf);
}
} /* end else */
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Aread_1VL */
herr_t
H5AreadVL_asstr
(JNIEnv *env, hid_t aid, hid_t tid, jobjectArray buf)
{
jint i;
jint n;
hid_t sid;
jstring jstr;
h5str_t h5str;
hvl_t *rdata;
hsize_t dims[H5S_MAX_RANK];
size_t size;
size_t max_len = 0;
herr_t status = -1;
/* Get size of string array */
n = ENVPTR->GetArrayLength(ENVPAR buf);
/* we will need to read n number of hvl_t structures */
rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t));
if (rdata == NULL) {
h5JNIFatalError(env, "H5AreadVL_asstr: failed to allocate buff for read");
} /* end if */
else {
status = H5Aread(aid, tid, rdata);
if (status < 0) {
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata);
H5Sclose(sid);
HDfree(rdata);
h5JNIFatalError(env, "H5AreadVL_asstr: failed to read data");
} /* end if */
else {
/* calculate the largest size of all the hvl_t structures read */
max_len = 1;
for (i=0; i < n; i++) {
if ((rdata + i)->len > max_len)
max_len = (rdata + i)->len;
}
/* create one malloc to hold largest element */
size = H5Tget_size(tid) * max_len;
HDmemset(&h5str, 0, sizeof(h5str_t));
h5str_new(&h5str, 4 * size);
if (h5str.s == NULL) {
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata);
H5Sclose(sid);
HDfree(rdata);
h5JNIFatalError(env, "H5AreadVL_asstr: failed to allocate buf");
} /* end if */
else {
H5T_class_t tclass = H5Tget_class(tid);
/* convert each element to char string */
for (i=0; i < n; i++) {
h5str.s[0] = '\0';
h5str_vlsprintf(&h5str, aid, tid, rdata+i, 0);
jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
} /* end for */
h5str_free(&h5str);
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, rdata);
H5Sclose(sid);
HDfree(rdata);
} /* end else */
} /* end else */
} /* end else */
return status;
}
herr_t
H5AreadVL_str
(JNIEnv *env, hid_t aid, hid_t tid, jobjectArray buf)
{
char **strs;
jstring jstr;
jint i;
jint n;
hid_t sid;
hsize_t dims[H5S_MAX_RANK];
herr_t status = -1;
n = ENVPTR->GetArrayLength(ENVPAR buf);
strs =(char**)HDcalloc((size_t)n, sizeof(char*));
if (strs == NULL) {
h5JNIFatalError(env, "H5AreadVL_str: failed to allocate buff for read variable length strings");
} /* end if */
else {
status = H5Aread(aid, tid, strs);
if (status < 0) {
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, strs);
H5Sclose(sid);
HDfree(strs);
h5JNIFatalError(env, "H5AreadVL_str: failed to read variable length strings");
} /* end if */
else {
for (i=0; i < n; i++) {
jstr = ENVPTR->NewStringUTF(ENVPAR strs[i]);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
H5free_memory (strs[i]);
} /* end for */
/*
for repeatedly reading a dataset with a large number of strs (e.g., 1,000,000 strings,
H5Dvlen_reclaim() may crash on Windows because the Java GC will not be able to collect
free space in time. Instead, use "H5free_memory(strs[i])" above to free individual strings
after it is done.
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, strs);
*/
HDfree(strs);
} /* end else */
} /* end else */
return status;
} /* end H5AreadVL_str */
/*
* Class: hdf_hdf5lib_H5
* Method: H5Aget_space

@ -67,6 +67,24 @@ JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5Aread
(JNIEnv *, jclass, jlong, jlong, jbyteArray);
/*
* Class: hdf_hdf5lib_H5
* Method: H5AwriteVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AwriteVL
(JNIEnv *, jclass, jlong, jlong, jobjectArray);
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AreadVL
(JNIEnv *, jclass, jlong, jlong, jobjectArray);
/*
* Class: hdf_hdf5lib_H5
* Method: H5Aget_space

@ -991,120 +991,6 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1double
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Dwrite_1double */
/*
* Class: hdf_hdf5lib_H5
* Method: H5DreadVL
* Signature: (JJJJJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5DreadVL
(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
{
herr_t status = -1;
htri_t isStr = 0;
htri_t isVlenStr = 0;
htri_t isComplex = 0;
if (buf == NULL) {
h5nullArgument(env, "H5DreadVL: buf is NULL");
} /* end if */
else {
isStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
if (H5Tget_class((hid_t)mem_type_id) == H5T_COMPOUND) {
unsigned i;
int nm = H5Tget_nmembers(mem_type_id);
for(i = 0; i <nm; i++) {
hid_t nested_tid = H5Tget_member_type((hid_t)mem_type_id, i);
isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND) ||
H5Tdetect_class((hid_t)nested_tid, H5T_VLEN);
H5Tclose(nested_tid);
}
}
else if (H5Tget_class((hid_t)mem_type_id) == H5T_VLEN) {
isVlenStr = 1; /* strings created by H5Tvlen_create( H5T_C_S1) */
}
if (isStr == 0 || isComplex>0 || isVlenStr) {
status = H5DreadVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id,
(hid_t)mem_space_id, (hid_t)file_space_id,
(hid_t)xfer_plist_id, buf);
}
else if (isStr > 0) {
status = H5DreadVL_str(env, (hid_t)dataset_id, (hid_t)mem_type_id,
(hid_t)mem_space_id, (hid_t)file_space_id,
(hid_t)xfer_plist_id, buf);
}
} /* end else */
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Dread_1VL */
herr_t
H5DreadVL_asstr
(JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf)
{
jint i;
jint n;
jstring jstr;
h5str_t h5str;
hvl_t *rdata;
size_t size;
size_t max_len = 0;
herr_t status = -1;
/* Get size of string array */
n = ENVPTR->GetArrayLength(ENVPAR buf);
/* we will need to read n number of hvl_t structures */
rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t));
if (rdata == NULL) {
h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buff for read");
} /* end if */
else {
status = H5Dread(did, tid, mem_sid, file_sid, xfer_plist_id, rdata);
if (status < 0) {
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
h5JNIFatalError(env, "H5DreadVL_notstr: failed to read data");
} /* end if */
else {
/* calculate the largest size of all the hvl_t structures read */
max_len = 1;
for (i=0; i < n; i++) {
if ((rdata + i)->len > max_len)
max_len = (rdata + i)->len;
}
/* create one malloc to hold largest element */
size = H5Tget_size(tid) * max_len;
HDmemset(&h5str, 0, sizeof(h5str_t));
h5str_new(&h5str, 4 * size);
if (h5str.s == NULL) {
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buf");
} /* end if */
else {
H5T_class_t tclass = H5Tget_class(tid);
/* convert each element to char string */
for (i=0; i < n; i++) {
h5str.s[0] = '\0';
h5str_vlsprintf(&h5str, did, tid, rdata+i, 0);
jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
} /* end for */
h5str_free(&h5str);
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
} /* end else */
} /* end else */
} /* end else */
return status;
}
/*
* Class: hdf_hdf5lib_H5
* Method: H5Dread_string
@ -1242,6 +1128,120 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1string
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Dwrite_1string */
/*
* Class: hdf_hdf5lib_H5
* Method: H5DreadVL
* Signature: (JJJJJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5DreadVL
(JNIEnv *env, jclass clss, jlong dataset_id, jlong mem_type_id, jlong mem_space_id,
jlong file_space_id, jlong xfer_plist_id, jobjectArray buf)
{
herr_t status = -1;
htri_t isStr = 0;
htri_t isVlenStr = 0;
htri_t isComplex = 0;
if (buf == NULL) {
h5nullArgument(env, "H5DreadVL: buf is NULL");
} /* end if */
else {
isStr = H5Tdetect_class((hid_t)mem_type_id, H5T_STRING);
if (H5Tget_class((hid_t)mem_type_id) == H5T_COMPOUND) {
unsigned i;
int nm = H5Tget_nmembers(mem_type_id);
for(i = 0; i <nm; i++) {
hid_t nested_tid = H5Tget_member_type((hid_t)mem_type_id, i);
isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND) ||
H5Tdetect_class((hid_t)nested_tid, H5T_VLEN);
H5Tclose(nested_tid);
}
}
else if (H5Tget_class((hid_t)mem_type_id) == H5T_VLEN) {
isVlenStr = 1; /* strings created by H5Tvlen_create(H5T_C_S1) */
}
if (isStr == 0 || isComplex>0 || isVlenStr) {
status = H5DreadVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id,
(hid_t)mem_space_id, (hid_t)file_space_id,
(hid_t)xfer_plist_id, buf);
}
else if (isStr > 0) {
status = H5DreadVL_str(env, (hid_t)dataset_id, (hid_t)mem_type_id,
(hid_t)mem_space_id, (hid_t)file_space_id,
(hid_t)xfer_plist_id, buf);
}
} /* end else */
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5Dread_1VL */
herr_t
H5DreadVL_asstr
(JNIEnv *env, hid_t did, hid_t tid, hid_t mem_sid, hid_t file_sid, hid_t xfer_plist_id, jobjectArray buf)
{
jint i;
jint n;
jstring jstr;
h5str_t h5str;
hvl_t *rdata;
size_t size;
size_t max_len = 0;
herr_t status = -1;
/* Get size of string array */
n = ENVPTR->GetArrayLength(ENVPAR buf);
/* we will need to read n number of hvl_t structures */
rdata = (hvl_t*)HDcalloc((size_t)n, sizeof(hvl_t));
if (rdata == NULL) {
h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buff for read");
} /* end if */
else {
status = H5Dread(did, tid, mem_sid, file_sid, xfer_plist_id, rdata);
if (status < 0) {
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
h5JNIFatalError(env, "H5DreadVL_notstr: failed to read data");
} /* end if */
else {
/* calculate the largest size of all the hvl_t structures read */
max_len = 1;
for (i=0; i < n; i++) {
if ((rdata + i)->len > max_len)
max_len = (rdata + i)->len;
}
/* create one malloc to hold largest element */
size = H5Tget_size(tid) * max_len;
HDmemset(&h5str, 0, sizeof(h5str_t));
h5str_new(&h5str, 4 * size);
if (h5str.s == NULL) {
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
h5JNIFatalError(env, "H5DreadVL_notstr: failed to allocate buf");
} /* end if */
else {
H5T_class_t tclass = H5Tget_class(tid);
/* convert each element to char string */
for (i=0; i < n; i++) {
h5str.s[0] = '\0';
h5str_vlsprintf(&h5str, did, tid, rdata+i, 0);
jstr = ENVPTR->NewStringUTF(ENVPAR h5str.s);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
} /* end for */
h5str_free(&h5str);
H5Dvlen_reclaim(tid, mem_sid, xfer_plist_id, rdata);
HDfree(rdata);
} /* end else */
} /* end else */
} /* end else */
return status;
}
/**
* Read VLEN data into array of arrays.
* Object[] buf contains VL arrays of data points

@ -2000,116 +2000,6 @@ h5tools_dump_simple_data
* Functions designed to workaround issues with the Java-C interface
*/
/*
* Class: hdf_hdf5lib_H5
* Method: H5AwriteVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AwriteVL
(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
{
herr_t status = -1;
char **wdata;
jsize size;
jint i;
size = ENVPTR->GetArrayLength(ENVPAR (jarray) buf);
wdata = (char**)HDcalloc((size_t)size + 1, sizeof(char*));
if (!wdata) {
h5JNIFatalError(env, "H5AwriteVL: cannot allocate buffer");
} /* end if */
else {
HDmemset(wdata, 0, (size_t)size * sizeof(char*));
for (i = 0; i < size; ++i) {
jstring obj = (jstring) ENVPTR->GetObjectArrayElement(ENVPAR (jobjectArray) buf, i);
if (obj != 0) {
jsize length = ENVPTR->GetStringUTFLength(ENVPAR obj);
const char *utf8 = ENVPTR->GetStringUTFChars(ENVPAR obj, 0);
if (utf8) {
wdata[i] = (char*)HDmalloc((size_t)length + 1);
if (wdata[i]) {
HDmemset(wdata[i], 0, ((size_t)length + 1));
HDstrncpy(wdata[i], utf8, (size_t)length);
} /* end if */
} /* end if */
ENVPTR->ReleaseStringUTFChars(ENVPAR obj, utf8);
ENVPTR->DeleteLocalRef(ENVPAR obj);
} /* end if */
} /* end for (i = 0; i < size; ++i) */
status = H5Awrite((hid_t)attr_id, (hid_t)mem_type_id, wdata);
for (i = 0; i < size; i++) {
if(wdata[i]) {
HDfree(wdata[i]);
} /* end if */
} /* end for */
HDfree(wdata);
if (status < 0)
h5libraryError(env);
} /* end else */
return (jint)status;
} /* end Java_hdf_hdf5lib_H5_H5AwriteVL */
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AreadVL
(JNIEnv *env, jclass clss, jlong attr_id, jlong mem_type_id, jobjectArray buf)
{
herr_t status = -1;
jstring jstr;
char **strs;
int i, n;
hid_t sid;
hsize_t dims[H5S_MAX_RANK];
n = ENVPTR->GetArrayLength(ENVPAR buf);
strs =(char **)HDmalloc((size_t)n * sizeof(char *));
if (strs == NULL) {
h5JNIFatalError( env, "H5AreadVL: failed to allocate buff for read variable length strings");
} /* end if */
else {
status = H5Aread(attr_id, mem_type_id, strs);
if (status < 0) {
dims[0] = (hsize_t)n;
sid = H5Screate_simple(1, dims, NULL);
H5Dvlen_reclaim(mem_type_id, sid, H5P_DEFAULT, strs);
H5Sclose(sid);
HDfree(strs);
h5JNIFatalError(env, "H5AreadVL: failed to read variable length strings");
} /* end if */
else {
for (i=0; i<n; i++) {
jstr = ENVPTR->NewStringUTF(ENVPAR strs[i]);
ENVPTR->SetObjectArrayElement(ENVPAR buf, i, jstr);
HDfree (strs[i]);
} /* end for */
/*
for repeatedly reading an attribute with a large number of strs (e.g., 1,000,000 strings,
H5Dvlen_reclaim() may crash on Windows because the Java GC will not be able to collect
free space in time. Instead, use "free(strs[i])" to free individual strings
after it is done.
H5Dvlen_reclaim(tid, sid, H5P_DEFAULT, strs);
*/
HDfree(strs);
} /* end else */
} /* end else */
return status;
} /* end Java_hdf_hdf5lib_H5_H5AreadVL */
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadComplex

@ -46,24 +46,6 @@ extern int h5str_dump_simple_dset(FILE *stream, hid_t dset, int binary_order
extern int h5str_dump_region_blocks_data(h5str_t *str, hid_t region, hid_t region_obj);
extern int h5str_dump_region_points_data(h5str_t *str, hid_t region, hid_t region_obj);
/*
* Class: hdf_hdf5lib_H5
* Method: H5AwriteVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AwriteVL
(JNIEnv *, jclass, jlong, jlong, jobjectArray);
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadVL
* Signature: (JJ[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5AreadVL
(JNIEnv *, jclass, jlong, jlong, jobjectArray);
/*
* Class: hdf_hdf5lib_H5
* Method: H5AreadComplex