/**
* Adds a new tensor data.
*
- * @param data The byte array to be added
- *
- * @throws IllegalArgumentException if given data is invalid
- * @throws IndexOutOfBoundsException when the maximum number of tensors in the list
- */
- private void addTensorData(@NonNull byte[] data) {
- if (data == null) {
- throw new IllegalArgumentException("Given data is null");
- }
-
- ByteBuffer buffer = allocateByteBuffer(data.length);
- buffer.put(data);
-
- addTensorData(buffer);
- }
-
- /**
- * Adds a new tensor data.
- *
* @param data The tensor data to be added
*
* @throws IllegalArgumentException if given data is invalid
private void addTensorData(@NonNull ByteBuffer data) {
int index = getTensorsCount();
- checkByteBuffer(index, data);
+ if (data.isDirect() && data.order() != ByteOrder.nativeOrder()) {
+ /* From native function NewDirectByteBuffer(), we should change the byte order. */
+ data = data.order(ByteOrder.nativeOrder());
+ }
+ checkByteBuffer(index, data);
mDataList.add(data);
}
info->mid_init = (*env)->GetMethodID (env, info->cls, "<init>",
"(L" NNS_CLS_TINFO ";)V");
info->mid_add_data = (*env)->GetMethodID (env, info->cls, "addTensorData",
- "([B)V");
+ "(Ljava/nio/ByteBuffer;)V");
info->mid_get_array = (*env)->GetMethodID (env, info->cls, "getDataArray",
"()[Ljava/lang/Object;");
info->mid_get_info = (*env)->GetMethodID (env, info->cls, "getTensorsInfo",
}
for (i = 0; i < data->num_tensors; i++) {
- jsize buffer_size = (jsize) data->tensors[i].size;
- jbyteArray buffer = (*env)->NewByteArray (env, buffer_size);
-
- (*env)->SetByteArrayRegion (env, buffer, 0, buffer_size,
- (jbyte *) data->tensors[i].tensor);
+ gsize data_size = data->tensors[i].size;
+ gpointer data_ptr = data->tensors[i].tensor;
+ jobject buffer = (*env)->NewDirectByteBuffer (env, data_ptr, data_size);
(*env)->CallVoidMethod (env, obj_data, dcls_info->mid_add_data, buffer);
(*env)->DeleteLocalRef (env, buffer);
*/
gboolean
nns_parse_tensors_data (pipeline_info_s * pipe_info, JNIEnv * env,
- jobject obj_data, ml_tensors_data_h * data_h, ml_tensors_info_h * info_h)
+ jobject obj_data, gboolean clone, ml_tensors_data_h * data_h, ml_tensors_info_h * info_h)
{
guint i;
data_class_info_s *dcls_info;
gsize data_size = (gsize) (*env)->GetDirectBufferCapacity (env, tensor);
gpointer data_ptr = (*env)->GetDirectBufferAddress (env, tensor);
- if (data->tensors[i].tensor == NULL)
- data->tensors[i].tensor = g_malloc (data_size);
- if (data->tensors[i].tensor == NULL) {
- nns_loge ("Failed to allocate memory %zd, index %d.", data_size, i);
- (*env)->DeleteLocalRef (env, tensor);
- failed = TRUE;
- goto done;
+ if (clone) {
+ if (data->tensors[i].tensor == NULL)
+ data->tensors[i].tensor = g_malloc (data_size);
+
+ memcpy (data->tensors[i].tensor, data_ptr, data_size);
+ } else {
+ data->tensors[i].tensor = data_ptr;
}
- memcpy (data->tensors[i].tensor, data_ptr, data_size);
data->tensors[i].size = data_size;
(*env)->DeleteLocalRef (env, tensor);
+ } else {
+ nns_loge ("Failed to get array element in tensors data object.");
+ failed = TRUE;
+ goto done;
}
}
goto done;
}
- if (!nns_parse_tensors_data (pipe_info, env, in, &in_data, NULL)) {
+ if (!nns_parse_tensors_data (pipe_info, env, in, FALSE, &in_data, NULL)) {
nns_loge ("Failed to parse input data.");
goto done;
}
status = ml_pipeline_src_input_data (src, in_data,
- ML_PIPELINE_BUF_POLICY_AUTO_FREE);
+ ML_PIPELINE_BUF_POLICY_DO_NOT_FREE);
if (status != ML_ERROR_NONE) {
nns_loge ("Failed to input tensors data to source node %s.", element_name);
goto done;
done:
(*env)->ReleaseStringUTFChars (env, name, element_name);
+ /* do not free input tensors (direct access from object) */
+ g_free (in_data);
return res;
}
single = pipe_info->pipeline_handle;
in_data = out_data = NULL;
- if (!nns_parse_tensors_data (pipe_info, env, in, &in_data, NULL)) {
+ if (!nns_parse_tensors_data (pipe_info, env, in, FALSE, &in_data, NULL)) {
nns_loge ("Failed to parse input tensors data.");
goto done;
}
}
done:
- ml_tensors_data_destroy (in_data);
+ /* do not free input tensors (direct access from object) */
+ g_free (in_data);
ml_tensors_data_destroy (out_data);
return result;
}