xref: /aosp_15_r20/external/armnn/delegate/armnnDelegateJNI/src/armnn_delegate_jni.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include <armnn_delegate.hpp>
7 #include <DelegateOptions.hpp>
8 
9 #if defined(ARMCOMPUTECL_ENABLED)
10 #include <arm_compute/core/CL/OpenCL.h>
11 #endif
12 
13 #include <jni.h>
14 #include <string>
15 
16 extern "C" {
17 
18 /// Creates an Arm NN Delegate object.
19 /// Options are passed in form of String arrays. For details about what options_keys and option_values
20 /// are supported please see:
21 //  armnnDelegate::DelegateOptions::DelegateOptions(char const* const*, char const* const*,size_t,void (*)(const char*))
22 JNIEXPORT jlong
Java_com_arm_armnn_delegate_ArmnnDelegate_createDelegate(JNIEnv * env,jclass clazz,jobjectArray optionKeys,jobjectArray optionValues)23 JNICALL Java_com_arm_armnn_delegate_ArmnnDelegate_createDelegate(JNIEnv* env,
24                                                                  jclass clazz,
25                                                                  jobjectArray optionKeys,
26                                                                  jobjectArray optionValues)
27 {
28     int numOptions = env->GetArrayLength(optionKeys);
29     const char* nativeOptionKeys[numOptions];
30     const char* nativeOptionValues[numOptions];
31 
32     jstring jKeyStrings[numOptions];
33     jstring jValueStrings[numOptions];
34 
35     // Convert java array of string into char so we can make use of it in cpp code
36     for (int i = 0; i < numOptions; i++)
37     {
38         jKeyStrings[i] = static_cast<jstring>(env->GetObjectArrayElement(optionKeys, i));
39         jValueStrings[i] = static_cast<jstring>(env->GetObjectArrayElement(optionValues, i));
40 
41         nativeOptionKeys[i] = env->GetStringUTFChars(jKeyStrings[i], 0);
42         nativeOptionValues[i] = env->GetStringUTFChars(jValueStrings[i], 0);
43     }
44 
45     armnnDelegate::DelegateOptions delegateOptions(nativeOptionKeys,
46                                                    nativeOptionValues,
47                                                    numOptions,
48                                                    nullptr);
49 
50     // Release jni memory. After the delegate options are created there is no need to hold on to it anymore.
51     for (int i = 0; i < numOptions; i++)
52     {
53         env->ReleaseStringUTFChars(jKeyStrings[i], nativeOptionKeys[i]);
54         env->ReleaseStringUTFChars(jValueStrings[i], nativeOptionValues[i]);
55     }
56 
57     return reinterpret_cast<jlong>(armnnDelegate::TfLiteArmnnDelegateCreate(delegateOptions));
58 }
59 
60 /// Destroys a given Arm NN Delegate object
61 JNIEXPORT void
Java_com_arm_armnn_delegate_ArmnnDelegate_deleteDelegate(JNIEnv * env,jclass clazz,jlong delegate)62 JNICALL Java_com_arm_armnn_delegate_ArmnnDelegate_deleteDelegate(JNIEnv* env, jclass clazz, jlong delegate)
63 {
64     armnnDelegate::TfLiteArmnnDelegateDelete(reinterpret_cast<TfLiteDelegate*>(delegate));
65 }
66 
67 /// Returns true if a Arm Mali GPU is detected.
68 /// Can be used to ensure that GpuAcc is supported on a device.
69 JNIEXPORT jboolean
Java_com_arm_armnn_delegate_ArmnnUtils_IsGpuAccSupported(JNIEnv * env,jclass clazz)70 JNICALL Java_com_arm_armnn_delegate_ArmnnUtils_IsGpuAccSupported(JNIEnv* env, jclass clazz)
71 {
72 #if defined(ARMCOMPUTECL_ENABLED)
73     cl::Device device = cl::Device::getDefault();
74     char device_name[32];
75     cl_int err = clGetDeviceInfo(device.get(), CL_DEVICE_NAME, sizeof(device_name), &device_name, NULL);
76     if (err != CL_SUCCESS)
77     {
78         return false;
79     }
80     // search for "Mali" in the devices name
81     if (strstr(device_name, "Mali"))
82     {
83         return true;
84     }
85 #endif
86     return false;
87 }
88 
89 /// Returns true if the current device supports Neon instructions.
90 /// Can be used to ensure the CpuAcc backend is supported.
91 JNIEXPORT jboolean
Java_com_arm_armnn_delegate_ArmnnUtils_IsNeonDetected(JNIEnv * env,jclass clazz)92 JNICALL Java_com_arm_armnn_delegate_ArmnnUtils_IsNeonDetected(JNIEnv* env, jclass clazz)
93 {
94     return armnn::NeonDetected();
95 }
96 
97 }
98 
99