Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Microsoft Onnxruntime OnnxTensor JNI

From Leeroopedia


Knowledge Sources Description
Source File java/src/main/native/ai_onnxruntime_OnnxTensor.c
Repository Microsoft/onnxruntime

Domains

  • JNI Native Bridge
  • Dense Tensor Operations
  • ORT Value Management

Overview

ai_onnxruntime_OnnxTensor.c is the JNI native implementation file for the OnnxTensor Java class. It provides native methods for creating dense tensors from direct buffers and strings, extracting scalar values and raw byte buffers from existing tensors, retrieving string arrays, and releasing native OrtValue resources.

Description

Key function groups:

  • Tensor creation: createTensorFromBuffer creates a numeric tensor from a Java direct buffer, shape array, and ONNX type. createString creates a scalar string tensor. createStringTensor creates a multi-element string tensor from a Java String array and shape.
  • Buffer access: getBuffer returns a direct ByteBuffer wrapping the tensor's native data memory. The buffer size is computed from element count and type size via getTensorTypeShape and onnxTypeSize.
  • Scalar extraction: getFloat, getDouble, getByte, getShort, getInt, getLong, getBool extract scalar values from rank-0 or rank-1 tensors. Some methods validate the ONNX type (e.g., getShort accepts UINT16, INT16, FLOAT16, BFLOAT16).
  • String access: getString extracts a single string from a string tensor. getStringArray copies all strings into a Java String array carrier.
  • Resource cleanup: close releases the native OrtValue via api->ReleaseValue.

All functions use checkOrtStatus for error handling and throw OrtException on failure. Scalar getters return default values (NAN, 0, false) when the ORT status check fails.

Code Reference

Source Location

// File: java/src/main/native/ai_onnxruntime_OnnxTensor.c

Signature

// Tensor creation
JNIEXPORT jlong JNICALL Java_ai_onnxruntime_OnnxTensor_createTensorFromBuffer
    (JNIEnv*, jclass, jlong apiHandle, jlong allocatorHandle,
     jobject buffer, jint bufferPos, jlong bufferSize,
     jlongArray shape, jint onnxTypeJava);
JNIEXPORT jlong JNICALL Java_ai_onnxruntime_OnnxTensor_createString
    (JNIEnv*, jclass, jlong apiHandle, jlong allocatorHandle, jstring input);
JNIEXPORT jlong JNICALL Java_ai_onnxruntime_OnnxTensor_createStringTensor
    (JNIEnv*, jclass, jlong apiHandle, jlong allocatorHandle,
     jobjectArray stringArr, jlongArray shape);

// Buffer access
JNIEXPORT jobject JNICALL Java_ai_onnxruntime_OnnxTensor_getBuffer
    (JNIEnv*, jobject, jlong apiHandle, jlong handle);

// Scalar extraction
JNIEXPORT jfloat   JNICALL Java_ai_onnxruntime_OnnxTensor_getFloat(JNIEnv*, jobject, jlong, jlong, jint);
JNIEXPORT jdouble  JNICALL Java_ai_onnxruntime_OnnxTensor_getDouble(JNIEnv*, jobject, jlong, jlong);
JNIEXPORT jbyte    JNICALL Java_ai_onnxruntime_OnnxTensor_getByte(JNIEnv*, jobject, jlong, jlong, jint);
JNIEXPORT jshort   JNICALL Java_ai_onnxruntime_OnnxTensor_getShort(JNIEnv*, jobject, jlong, jlong, jint);
JNIEXPORT jint     JNICALL Java_ai_onnxruntime_OnnxTensor_getInt(JNIEnv*, jobject, jlong, jlong, jint);
JNIEXPORT jlong    JNICALL Java_ai_onnxruntime_OnnxTensor_getLong(JNIEnv*, jobject, jlong, jlong, jint);
JNIEXPORT jboolean JNICALL Java_ai_onnxruntime_OnnxTensor_getBool(JNIEnv*, jobject, jlong, jlong);

// String access
JNIEXPORT jstring JNICALL Java_ai_onnxruntime_OnnxTensor_getString(JNIEnv*, jobject, jlong, jlong);
JNIEXPORT void    JNICALL Java_ai_onnxruntime_OnnxTensor_getStringArray(JNIEnv*, jobject, jlong, jlong, jobjectArray);

// Resource cleanup
JNIEXPORT void JNICALL Java_ai_onnxruntime_OnnxTensor_close(JNIEnv*, jobject, jlong, jlong);

Import

#include "OrtJniUtil.h"
#include "ai_onnxruntime_OnnxTensor.h"

I/O Contract

Inputs

Name Type Description
apiHandle jlong Pointer to the ORT C API struct
handle jlong Pointer to the native OrtValue (tensor)
allocatorHandle jlong Pointer to the ORT allocator
buffer jobject (Buffer) Java direct buffer containing tensor data
bufferPos jint Byte offset into the buffer
bufferSize jlong Total size of the buffer in bytes
shape jlongArray Tensor shape dimensions
onnxTypeJava jint ONNX tensor element data type as Java int
input jstring String value for scalar string tensor creation
stringArr jobjectArray Array of Java strings for string tensor creation

Outputs

Name Type Description
nativeHandle jlong Pointer to the newly created OrtValue (NULL on failure)
ByteBuffer jobject Direct ByteBuffer wrapping native tensor data
scalar jfloat/jdouble/jbyte/jshort/jint/jlong/jboolean Scalar tensor value
string jstring String extracted from a string tensor

Usage Examples

// Inside JNI: create a float tensor from a direct buffer
jlong tensorHandle = Java_ai_onnxruntime_OnnxTensor_createTensorFromBuffer(
    jniEnv, cls, apiHandle, allocHandle,
    floatBuffer, 0, bufferSizeBytes, shapeArray, ONNX_FLOAT_TYPE);

// Extract the raw byte buffer for a tensor
jobject byteBuf = Java_ai_onnxruntime_OnnxTensor_getBuffer(
    jniEnv, tensorObj, apiHandle, tensorHandle);

// Read a scalar float value
jfloat val = Java_ai_onnxruntime_OnnxTensor_getFloat(
    jniEnv, tensorObj, apiHandle, tensorHandle, onnxTypeInt);

// Create a multi-element string tensor
jlong strTensor = Java_ai_onnxruntime_OnnxTensor_createStringTensor(
    jniEnv, cls, apiHandle, allocHandle, stringArray, shapeArray);

// Release the tensor
Java_ai_onnxruntime_OnnxTensor_close(jniEnv, tensorObj, apiHandle, tensorHandle);

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment