// // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #if defined(ARMCOMPUTECL_ENABLED) #include #endif #include #include extern "C" { /// Creates an Arm NN Delegate object. /// Options are passed in form of String arrays. For details about what options_keys and option_values /// are supported please see: // armnnDelegate::DelegateOptions::DelegateOptions(char const* const*, char const* const*,size_t,void (*)(const char*)) JNIEXPORT jlong JNICALL Java_com_arm_armnn_delegate_ArmnnDelegate_createDelegate(JNIEnv* env, jclass clazz, jobjectArray optionKeys, jobjectArray optionValues) { int numOptions = env->GetArrayLength(optionKeys); const char* nativeOptionKeys[numOptions]; const char* nativeOptionValues[numOptions]; jstring jKeyStrings[numOptions]; jstring jValueStrings[numOptions]; // Convert java array of string into char so we can make use of it in cpp code for (int i = 0; i < numOptions; i++) { jKeyStrings[i] = static_cast(env->GetObjectArrayElement(optionKeys, i)); jValueStrings[i] = static_cast(env->GetObjectArrayElement(optionValues, i)); nativeOptionKeys[i] = env->GetStringUTFChars(jKeyStrings[i], 0); nativeOptionValues[i] = env->GetStringUTFChars(jValueStrings[i], 0); } armnnDelegate::DelegateOptions delegateOptions(nativeOptionKeys, nativeOptionValues, numOptions, nullptr); // Release jni memory. After the delegate options are created there is no need to hold on to it anymore. for (int i = 0; i < numOptions; i++) { env->ReleaseStringUTFChars(jKeyStrings[i], nativeOptionKeys[i]); env->ReleaseStringUTFChars(jValueStrings[i], nativeOptionValues[i]); } return reinterpret_cast(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions)); } /// Destroys a given Arm NN Delegate object JNIEXPORT void JNICALL Java_com_arm_armnn_delegate_ArmnnDelegate_deleteDelegate(JNIEnv* env, jclass clazz, jlong delegate) { armnnDelegate::TfLiteArmnnDelegateDelete(reinterpret_cast(delegate)); } /// Returns true if a Arm Mali GPU is detected. /// Can be used to ensure that GpuAcc is supported on a device. JNIEXPORT jboolean JNICALL Java_com_arm_armnn_delegate_ArmnnUtils_IsGpuAccSupported(JNIEnv* env, jclass clazz) { #if defined(ARMCOMPUTECL_ENABLED) cl::Device device = cl::Device::getDefault(); char device_name[32]; cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, sizeof(device_name), &device_name, NULL); if (err != CL_SUCCESS) { return false; } // search for "Mali" in the devices name if (strstr(device_name, "Mali")) { return true; } #endif return false; } /// Returns true if the current device supports Neon instructions. /// Can be used to ensure the CpuAcc backend is supported. JNIEXPORT jboolean JNICALL Java_com_arm_armnn_delegate_ArmnnUtils_IsNeonDetected(JNIEnv* env, jclass clazz) { return armnn::NeonDetected(); } }