Java: Set C language warnings to W4 and adjust JNI code (#6347)

Set /W3 for C language and fix up JNI warnings.
This commit is contained in:
Dmitri Smirnov 2021-01-14 15:04:47 -08:00 committed by GitHub
parent e54e2f969d
commit 6d0fb3ebb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 70 additions and 41 deletions

View file

@ -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

View file

@ -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
}

View file

@ -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);

View file

@ -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));

View file

@ -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;

View file

@ -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

View file

@ -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;
}
/*