Implementation:Microsoft Onnxruntime OnnxTensor JNI
Appearance
| 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:
createTensorFromBuffercreates a numeric tensor from a Java direct buffer, shape array, and ONNX type.createStringcreates a scalar string tensor.createStringTensorcreates a multi-element string tensor from a Java String array and shape. - Buffer access:
getBufferreturns a direct ByteBuffer wrapping the tensor's native data memory. The buffer size is computed from element count and type size viagetTensorTypeShapeandonnxTypeSize. - Scalar extraction:
getFloat,getDouble,getByte,getShort,getInt,getLong,getBoolextract scalar values from rank-0 or rank-1 tensors. Some methods validate the ONNX type (e.g.,getShortaccepts UINT16, INT16, FLOAT16, BFLOAT16). - String access:
getStringextracts a single string from a string tensor.getStringArraycopies all strings into a Java String array carrier. - Resource cleanup:
closereleases the native OrtValue viaapi->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
- OnnxTensor.java - Java-side tensor class calling these natives
- OrtJniUtil.c - Shared utility functions (checkOrtStatus, getTensorTypeShape, onnxTypeSize, createStringArrayFromTensor)
- ai_onnxruntime_OnnxSparseTensor.c - Sparse tensor JNI counterpart
Page Connections
Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment