diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 8e4c7d6536..5879cad6c0 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -899,6 +899,7 @@ if (WIN32) # parallel build # These compiler opitions cannot be forwarded to NVCC, so cannot use add_compiler_options string(APPEND CMAKE_CXX_FLAGS " /MP /W4") + string(APPEND CMAKE_C_FLAGS " /MP /W4") #Compiler bug, we should get such warnings. It will be fixed in a new VC release string(APPEND CMAKE_CXX_FLAGS " /wd4127") # class needs to have dll-interface to be used by clients diff --git a/java/src/main/native/OrtJniUtil.c b/java/src/main/native/OrtJniUtil.c index 53ed61c671..7e5229ee69 100644 --- a/java/src/main/native/OrtJniUtil.c +++ b/java/src/main/native/OrtJniUtil.c @@ -236,8 +236,8 @@ jobject convertToTensorInfo(JNIEnv *jniEnv, const OrtApi * api, const OrtTensorT jint onnxTypeInt = convertFromONNXDataFormat(onnxType); // Create the long array for the shape. - jlongArray shape = (*jniEnv)->NewLongArray(jniEnv, numDim); - (*jniEnv)->SetLongArrayRegion(jniEnv, shape, 0, numDim, (jlong*)dimensions); + jlongArray shape = (*jniEnv)->NewLongArray(jniEnv, safecast_size_t_to_jsize(numDim)); + (*jniEnv)->SetLongArrayRegion(jniEnv, shape, 0, safecast_size_t_to_jsize(numDim), (jlong*)dimensions); // Free the dimensions array free(dimensions); dimensions = NULL; @@ -485,7 +485,7 @@ size_t copyJavaToPrimitiveArray(JNIEnv *jniEnv, ONNXTensorElementDataType onnxTy } size_t copyJavaToTensor(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, - uint32_t dimensionsRemaining, jarray input) { + size_t dimensionsRemaining, jarray input) { if (dimensionsRemaining == 1) { // write out 1d array of the respective primitive type return copyJavaToPrimitiveArray(jniEnv,onnxType,tensor,input); @@ -576,7 +576,7 @@ size_t copyPrimitiveArrayToJava(JNIEnv *jniEnv, ONNXTensorElementDataType onnxTy } size_t copyTensorToJava(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, - uint32_t dimensionsRemaining, jarray output) { + size_t dimensionsRemaining, jarray output) { if (dimensionsRemaining == 1) { // write out 1d array of the respective primitive type return copyPrimitiveArrayToJava(jniEnv,onnxType,tensor,output); @@ -650,7 +650,7 @@ void copyStringTensorToArray(JNIEnv *jniEnv, const OrtApi * api, OrtAllocator* a memcpy(tempBuffer,characterBuffer+offsets[i],curSize); tempBuffer[curSize-1] = '\0'; jobject tempString = (*jniEnv)->NewStringUTF(jniEnv,tempBuffer); - (*jniEnv)->SetObjectArrayElement(jniEnv,outputArray,i,tempString); + (*jniEnv)->SetObjectArrayElement(jniEnv,outputArray,safecast_size_t_to_jsize(i),tempString); } if (tempBuffer != NULL) { @@ -672,7 +672,7 @@ jobjectArray createStringArrayFromTensor(JNIEnv *jniEnv, const OrtApi * api, Ort // Create the java array jclass stringClazz = (*jniEnv)->FindClass(jniEnv,"java/lang/String"); - jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,length,stringClazz,NULL); + jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(length),stringClazz, NULL); copyStringTensorToArray(jniEnv, api, allocator, tensor, length, outputArray); @@ -696,7 +696,7 @@ jlongArray createLongArrayFromTensor(JNIEnv *jniEnv, const OrtApi * api, OrtValu checkOrtStatus(jniEnv,api,api->GetTensorMutableData((OrtValue*)tensor,(void**)&arr)); // Create the java array and copy to it. - jlongArray outputArray = (*jniEnv)->NewLongArray(jniEnv,length); + jlongArray outputArray = (*jniEnv)->NewLongArray(jniEnv,safecast_size_t_to_jsize(length)); copyPrimitiveArrayToJava(jniEnv, value, arr, outputArray); return outputArray; } @@ -718,7 +718,7 @@ jfloatArray createFloatArrayFromTensor(JNIEnv *jniEnv, const OrtApi * api, OrtVa checkOrtStatus(jniEnv,api,api->GetTensorMutableData((OrtValue*)tensor,(void**)&arr)); // Create the java array and copy to it. - jfloatArray outputArray = (*jniEnv)->NewFloatArray(jniEnv,length); + jfloatArray outputArray = (*jniEnv)->NewFloatArray(jniEnv,safecast_size_t_to_jsize(length)); copyPrimitiveArrayToJava(jniEnv, value, arr, outputArray); return outputArray; } @@ -740,7 +740,7 @@ jdoubleArray createDoubleArrayFromTensor(JNIEnv *jniEnv, const OrtApi * api, Ort checkOrtStatus(jniEnv,api,api->GetTensorMutableData((OrtValue*)tensor,(void**)&arr)); // Create the java array and copy to it. - jdoubleArray outputArray = (*jniEnv)->NewDoubleArray(jniEnv,length); + jdoubleArray outputArray = (*jniEnv)->NewDoubleArray(jniEnv,safecast_size_t_to_jsize(length)); copyPrimitiveArrayToJava(jniEnv, value, arr, outputArray); return outputArray; } @@ -1022,7 +1022,7 @@ jint convertErrorCode(OrtErrorCode code) { void checkOrtStatus(JNIEnv *jniEnv, const OrtApi * api, OrtStatus * status) { if (status != NULL) { const char* message = api->GetErrorMessage(status); - int len = strlen(message)+1; + size_t len = strlen(message)+1; char* copy = malloc(sizeof(char)*len); memcpy(copy,message,len); int messageId = convertErrorCode(api->GetErrorCode(status)); @@ -1030,3 +1030,27 @@ void checkOrtStatus(JNIEnv *jniEnv, const OrtApi * api, OrtStatus * status) { throwOrtException(jniEnv,messageId,copy); } } + +jsize safecast_size_t_to_jsize(size_t v) { +#ifndef NDEBUG + jsize result = (jsize)v; + if (v != (size_t)result) { + abort(); + } + return result; +#else + return (jsize)v; +#endif +} + +jsize safecast_int64_to_jsize(int64_t v) { +#ifndef NDEBUG + jsize result = (jsize)v; + if (v != (int64_t)result) { + abort(); + } + return result; +#else + return (jsize)v; +#endif +} diff --git a/java/src/main/native/OrtJniUtil.h b/java/src/main/native/OrtJniUtil.h index e42af5dd6c..f0c63f066e 100644 --- a/java/src/main/native/OrtJniUtil.h +++ b/java/src/main/native/OrtJniUtil.h @@ -11,6 +11,10 @@ extern "C" { #endif +jsize safecast_size_t_to_jsize(size_t v); + +jsize safecast_int64_to_jsize(int64_t v); + jint JNI_OnLoad(JavaVM *vm, void *reserved); OrtLoggingLevel convertLoggingLevel(jint level); @@ -39,11 +43,11 @@ jobject createEmptySequenceInfo(JNIEnv *jniEnv); size_t copyJavaToPrimitiveArray(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, jarray input); -size_t copyJavaToTensor(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, uint32_t dimensionsRemaining, jarray input); +size_t copyJavaToTensor(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, size_t dimensionsRemaining, jarray input); size_t copyPrimitiveArrayToJava(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, jarray output); -size_t copyTensorToJava(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, uint32_t dimensionsRemaining, jarray output); +size_t copyTensorToJava(JNIEnv *jniEnv, ONNXTensorElementDataType onnxType, uint8_t* tensor, size_t tensorSize, size_t dimensionsRemaining, jarray output); jobject createStringFromStringTensor(JNIEnv *jniEnv, const OrtApi * api, OrtAllocator* allocator, OrtValue* tensor); diff --git a/java/src/main/native/ai_onnxruntime_OnnxSequence.c b/java/src/main/native/ai_onnxruntime_OnnxSequence.c index b045ce4665..ac156e3dc0 100644 --- a/java/src/main/native/ai_onnxruntime_OnnxSequence.c +++ b/java/src/main/native/ai_onnxruntime_OnnxSequence.c @@ -179,11 +179,11 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OnnxSequence_getStrings checkOrtStatus(jniEnv,api,api->GetValueCount(sequence,&count)); jclass stringClazz = (*jniEnv)->FindClass(jniEnv,"java/lang/String"); - jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,count,stringClazz,NULL); + jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(count),stringClazz, NULL); for (size_t i = 0; i < count; i++) { // Extract element OrtValue* element; - checkOrtStatus(jniEnv,api,api->GetValue(sequence,i,allocator,&element)); + checkOrtStatus(jniEnv,api,api->GetValue(sequence,(int)i,allocator,&element)); createStringFromStringTensor(jniEnv,api,allocator,element); @@ -215,7 +215,7 @@ JNIEXPORT jlongArray JNICALL Java_ai_onnxruntime_OnnxSequence_getLongs for (size_t i = 0; i < count; i++) { // Extract element OrtValue* element; - checkOrtStatus(jniEnv,api,api->GetValue(sequence,i,allocator,&element)); + checkOrtStatus(jniEnv,api,api->GetValue(sequence,(int)i,allocator,&element)); // Extract the values int64_t* arr; @@ -225,8 +225,8 @@ JNIEXPORT jlongArray JNICALL Java_ai_onnxruntime_OnnxSequence_getLongs api->ReleaseValue(element); } - jlongArray outputArray = (*jniEnv)->NewLongArray(jniEnv,count); - (*jniEnv)->SetLongArrayRegion(jniEnv,outputArray,0,count,(jlong*)values); + jlongArray outputArray = (*jniEnv)->NewLongArray(jniEnv,safecast_size_t_to_jsize(count)); + (*jniEnv)->SetLongArrayRegion(jniEnv, outputArray,0,safecast_size_t_to_jsize(count),(jlong*)values); checkOrtStatus(jniEnv,api,api->AllocatorFree(allocator,values)); @@ -255,7 +255,7 @@ JNIEXPORT jfloatArray JNICALL Java_ai_onnxruntime_OnnxSequence_getFloats for (size_t i = 0; i < count; i++) { // Extract element OrtValue* element; - checkOrtStatus(jniEnv,api,api->GetValue(sequence,i,allocator,&element)); + checkOrtStatus(jniEnv,api,api->GetValue(sequence,(int)i,allocator,&element)); // Extract the values float* arr; @@ -265,8 +265,8 @@ JNIEXPORT jfloatArray JNICALL Java_ai_onnxruntime_OnnxSequence_getFloats api->ReleaseValue(element); } - jfloatArray outputArray = (*jniEnv)->NewFloatArray(jniEnv,count); - (*jniEnv)->SetFloatArrayRegion(jniEnv,outputArray,0,count,values); + jfloatArray outputArray = (*jniEnv)->NewFloatArray(jniEnv,safecast_size_t_to_jsize(count)); + (*jniEnv)->SetFloatArrayRegion(jniEnv,outputArray,0,safecast_size_t_to_jsize(count),values); checkOrtStatus(jniEnv,api,api->AllocatorFree(allocator,values)); @@ -295,7 +295,7 @@ JNIEXPORT jdoubleArray JNICALL Java_ai_onnxruntime_OnnxSequence_getDoubles for (size_t i = 0; i < count; i++) { // Extract element OrtValue* element; - checkOrtStatus(jniEnv,api,api->GetValue(sequence,i,allocator,&element)); + checkOrtStatus(jniEnv,api,api->GetValue(sequence,(int)i,allocator,&element)); // Extract the values double* arr; @@ -305,8 +305,8 @@ JNIEXPORT jdoubleArray JNICALL Java_ai_onnxruntime_OnnxSequence_getDoubles api->ReleaseValue(element); } - jdoubleArray outputArray = (*jniEnv)->NewDoubleArray(jniEnv,count); - (*jniEnv)->SetDoubleArrayRegion(jniEnv,outputArray,0,count,values); + jdoubleArray outputArray = (*jniEnv)->NewDoubleArray(jniEnv,safecast_size_t_to_jsize(count)); + (*jniEnv)->SetDoubleArrayRegion(jniEnv,outputArray,0,safecast_size_t_to_jsize(count),values); checkOrtStatus(jniEnv,api,api->AllocatorFree(allocator,values)); diff --git a/java/src/main/native/ai_onnxruntime_OnnxTensor.c b/java/src/main/native/ai_onnxruntime_OnnxTensor.c index f1b12dc905..d7e2fbb8d7 100644 --- a/java/src/main/native/ai_onnxruntime_OnnxTensor.c +++ b/java/src/main/native/ai_onnxruntime_OnnxTensor.c @@ -154,7 +154,7 @@ JNIEXPORT jlong JNICALL Java_ai_onnxruntime_OnnxTensor_createStringTensor checkOrtStatus(jniEnv, api, api->AllocatorAlloc(allocator,sizeof(jobject)*length,(void**)&javaStrings)); // Copy the java strings into the buffers - for (int i = 0; i < length; i++) { + for (jsize i = 0; i < length; i++) { javaStrings[i] = (*jniEnv)->GetObjectArrayElement(jniEnv,stringArr,i); strings[i] = (*jniEnv)->GetStringUTFChars(jniEnv,javaStrings[i],NULL); } @@ -168,7 +168,7 @@ JNIEXPORT jlong JNICALL Java_ai_onnxruntime_OnnxTensor_createStringTensor } // Release the buffers - checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, strings)); + checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, (void*)strings)); checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, javaStrings)); return (jlong) ortValue; diff --git a/java/src/main/native/ai_onnxruntime_OrtSession.c b/java/src/main/native/ai_onnxruntime_OrtSession.c index 6ac19c9e07..b439c8542e 100644 --- a/java/src/main/native/ai_onnxruntime_OrtSession.c +++ b/java/src/main/native/ai_onnxruntime_OrtSession.c @@ -90,7 +90,7 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_getInputNames size_t numInputs = Java_ai_onnxruntime_OrtSession_getNumInputs(jniEnv, jobj, apiHandle, sessionHandle); // Allocate the return array - jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,numInputs,stringClazz,NULL); + jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(numInputs),stringClazz,NULL); for (uint32_t i = 0; i < numInputs; i++) { // Read out the input name and convert it to a java.lang.String char* inputName; @@ -136,7 +136,7 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_getOutputNames size_t numOutputs = Java_ai_onnxruntime_OrtSession_getNumOutputs(jniEnv, jobj, apiHandle, sessionHandle); // Allocate the return array - jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,numOutputs,stringClazz,NULL); + jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(numOutputs),stringClazz, NULL); for (uint32_t i = 0; i < numOutputs; i++) { // Read out the output name and convert it to a java.lang.String char* outputName; @@ -169,8 +169,8 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_getInputInfo size_t numInputs = Java_ai_onnxruntime_OrtSession_getNumInputs(jniEnv, jobj, apiHandle, sessionHandle); // Allocate the return array - jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,numInputs,nodeInfoClazz,NULL); - for (uint32_t i = 0; i < numInputs; i++) { + jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(numInputs),nodeInfoClazz, NULL); + for (size_t i = 0; i < numInputs; i++) { // Read out the input name and convert it to a java.lang.String char* inputName; checkOrtStatus(jniEnv,api,api->SessionGetInputName((OrtSession*)sessionHandle, i, allocator, &inputName)); @@ -185,7 +185,7 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_getInputInfo // Create a NodeInfo and assign into the array jobject nodeInfo = (*jniEnv)->NewObject(jniEnv, nodeInfoClazz, nodeInfoConstructor, name, valueInfoJava); - (*jniEnv)->SetObjectArrayElement(jniEnv, array, i, nodeInfo); + (*jniEnv)->SetObjectArrayElement(jniEnv, array,safecast_size_t_to_jsize(i),nodeInfo); } return array; @@ -210,7 +210,7 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_getOutputInfo size_t numOutputs = Java_ai_onnxruntime_OrtSession_getNumOutputs(jniEnv, jobj, apiHandle, sessionHandle); // Allocate the return array - jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,numOutputs,nodeInfoClazz,NULL); + jobjectArray array = (*jniEnv)->NewObjectArray(jniEnv,safecast_size_t_to_jsize(numOutputs),nodeInfoClazz,NULL); for (uint32_t i = 0; i < numOutputs; i++) { // Read out the output name and convert it to a java.lang.String char* outputName; @@ -284,7 +284,7 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_run // Construct the output array of ONNXValues char *onnxValueClassName = "ai/onnxruntime/OnnxValue"; jclass onnxValueClass = (*jniEnv)->FindClass(jniEnv, onnxValueClassName); - jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,numOutputs,onnxValueClass,NULL); + jobjectArray outputArray = (*jniEnv)->NewObjectArray(jniEnv,safecast_int64_to_jsize(numOutputs), onnxValueClass, NULL); // Convert the output tensors into ONNXValues and release the output strings. for (int i = 0; i < numOutputs; i++) { @@ -302,8 +302,8 @@ JNIEXPORT jobjectArray JNICALL Java_ai_onnxruntime_OrtSession_run } // Release the buffers - checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, inputNames)); - checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, outputNames)); + checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, (void*)inputNames)); + checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, (void*)outputNames)); checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, javaInputStrings)); checkOrtStatus(jniEnv, api, api->AllocatorFree(allocator, javaOutputStrings)); @@ -413,7 +413,7 @@ JNIEXPORT jstring JNICALL Java_ai_onnxruntime_OrtSession_constructMetadata checkOrtStatus(jniEnv,api,api->ModelMetadataGetCustomMetadataMapKeys(metadata, allocator, &keys, &numKeys)); jobjectArray customArray = NULL; if (numKeys > 0) { - customArray = (*jniEnv)->NewObjectArray(jniEnv,numKeys*2,stringClazz,NULL); + customArray = (*jniEnv)->NewObjectArray(jniEnv,safecast_int64_to_jsize(numKeys * 2),stringClazz, NULL); // Iterate key array to extract the values for (int64_t i = 0; i < numKeys; i++) { @@ -426,8 +426,8 @@ JNIEXPORT jstring JNICALL Java_ai_onnxruntime_OrtSession_constructMetadata checkOrtStatus(jniEnv,api,api->AllocatorFree(allocator,charBuffer)); // Write the key and value into the array - (*jniEnv)->SetObjectArrayElement(jniEnv, customArray, i*2, keyJava); - (*jniEnv)->SetObjectArrayElement(jniEnv, customArray, (i*2)+1, valueJava); + (*jniEnv)->SetObjectArrayElement(jniEnv,customArray,safecast_int64_to_jsize(i*2),keyJava); + (*jniEnv)->SetObjectArrayElement(jniEnv,customArray,safecast_int64_to_jsize((i * 2) + 1),valueJava); } // Release key array diff --git a/java/src/main/native/ai_onnxruntime_OrtSession_RunOptions.c b/java/src/main/native/ai_onnxruntime_OrtSession_RunOptions.c index eda097a28e..d404d1ceb4 100644 --- a/java/src/main/native/ai_onnxruntime_OrtSession_RunOptions.c +++ b/java/src/main/native/ai_onnxruntime_OrtSession_RunOptions.c @@ -43,9 +43,9 @@ JNIEXPORT jint JNICALL Java_ai_onnxruntime_OrtSession_00024RunOptions_getLogLeve (JNIEnv * jniEnv, jobject jobj, jlong apiHandle, jlong nativeHandle) { (void) jobj; // Required JNI parameters not needed by functions which don't need to access their host object. const OrtApi* api = (const OrtApi*) apiHandle; - jint logLevel; + int logLevel; checkOrtStatus(jniEnv,api,api->RunOptionsGetRunLogSeverityLevel((OrtRunOptions*) nativeHandle,&logLevel)); - return logLevel; + return (jint)logLevel; } /* @@ -69,9 +69,9 @@ JNIEXPORT jint JNICALL Java_ai_onnxruntime_OrtSession_00024RunOptions_getLogVerb (JNIEnv * jniEnv, jobject jobj, jlong apiHandle, jlong nativeHandle) { (void) jobj; // Required JNI parameters not needed by functions which don't need to access their host object. const OrtApi* api = (const OrtApi*) apiHandle; - jint logLevel; + int logLevel; checkOrtStatus(jniEnv,api,api->RunOptionsGetRunLogVerbosityLevel((OrtRunOptions*) nativeHandle,&logLevel)); - return logLevel; + return (jint)logLevel; } /*