LOCAL_SRC_FILES := $(SNPE_LIB_PATH)/libSNPE.so
include $(PREBUILT_SHARED_LIBRARY)
SNPE_PREBUILT_LIBS += libSNPE
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libsnpe_adsp
+LOCAL_SRC_FILES := $(SNPE_LIB_PATH)/libsnpe_adsp.so
+include $(PREBUILT_SHARED_LIBRARY)
+SNPE_PREBUILT_LIBS += libsnpe_adsp
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libsnpe_dsp_domains
+LOCAL_SRC_FILES := $(SNPE_LIB_PATH)/libsnpe_dsp_domains.so
+include $(PREBUILT_SHARED_LIBRARY)
+SNPE_PREBUILT_LIBS += libsnpe_dsp_domains
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libsnpe_dsp_domains_v2
+LOCAL_SRC_FILES := $(SNPE_LIB_PATH)/libsnpe_dsp_domains_v2.so
+include $(PREBUILT_SHARED_LIBRARY)
+SNPE_PREBUILT_LIBS += libsnpe_dsp_domains_v2
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libhta
+LOCAL_SRC_FILES := $(SNPE_LIB_PATH)/libhta.so
+include $(PREBUILT_SHARED_LIBRARY)
+SNPE_PREBUILT_LIBS += libhta
}
/**
+ * @brief Set additional environment
+ */
+static gboolean
+nns_set_env (JNIEnv * env, jobject context)
+{
+ gboolean ret = TRUE;
+
+#if defined (ENABLE_SNPE)
+ gboolean snpe_failed = TRUE;
+
+ jclass context_class = NULL;
+ jmethodID get_application_info_method_id = NULL;
+ jobject application_info_object = NULL;
+ jclass application_info_object_class = NULL;
+ jfieldID native_library_dir_field_id = NULL;
+ jstring native_library_dir_path = NULL;
+
+ const gchar *native_library_dir_path_str;
+ gchar *new_path;
+
+ context_class = (*env)->GetObjectClass (env, context);
+ if (!context_class) {
+ nns_loge ("Failed to get context class.");
+ goto snpe_done;
+ }
+
+ get_application_info_method_id = (*env)->GetMethodID (env, context_class,
+ "getApplicationInfo", "()Landroid/content/pm/ApplicationInfo;");
+ if (!get_application_info_method_id) {
+ nns_loge ("Failed to get method ID for `ApplicationInfo()`.");
+ goto snpe_done;
+ }
+
+ application_info_object = (*env)->CallObjectMethod (env, context,
+ get_application_info_method_id);
+ if ((*env)->ExceptionCheck (env)) {
+ (*env)->ExceptionDescribe (env);
+ (*env)->ExceptionClear (env);
+ nns_loge ("Failed to call method `ApplicationInfo()`.");
+ goto snpe_done;
+ }
+
+ application_info_object_class = (*env)->GetObjectClass (env,
+ application_info_object);
+ if (!application_info_object_class) {
+ nns_loge ("Failed to get `ApplicationInfo` object class");
+ goto snpe_done;
+ }
+
+ native_library_dir_field_id = (*env)->GetFieldID (env,
+ application_info_object_class,
+ "nativeLibraryDir", "Ljava/lang/String;");
+ if (!native_library_dir_field_id) {
+ nns_loge ("Failed to get field ID for `nativeLibraryDir`.");
+ goto snpe_done;
+ }
+
+ native_library_dir_path = (*env)->GetObjectField (env,
+ application_info_object, native_library_dir_field_id);
+ if (!native_library_dir_path) {
+ nns_loge ("Failed to get field `nativeLibraryDir`.");
+ goto snpe_done;
+ }
+
+ native_library_dir_path_str = (*env)->GetStringUTFChars (env,
+ native_library_dir_path, NULL);
+ if ((*env)->ExceptionCheck (env)) {
+ (*env)->ExceptionDescribe (env);
+ (*env)->ExceptionClear (env);
+ nns_loge ("Failed to get string `nativeLibraryDir`");
+ goto snpe_done;
+ }
+
+ new_path = g_strconcat (native_library_dir_path_str,
+ ";/system/lib/rfsa/adsp;/system/vendor/lib/rfsa/adsp;/dsp", NULL);
+
+ /* See https://developer.qualcomm.com/docs/snpe/dsp_runtime.html for details */
+ nns_logi ("Set env ADSP_LIBRARY_PATH for snpe DSP/AIP runtime: %s",
+ new_path);
+ g_setenv ("ADSP_LIBRARY_PATH", new_path, TRUE);
+
+ g_free (new_path);
+ (*env)->ReleaseStringUTFChars (env, native_library_dir_path,
+ native_library_dir_path_str);
+
+ snpe_failed = FALSE;
+
+snpe_done:
+ ret = ret && !(snpe_failed);
+
+ if (native_library_dir_path) {
+ (*env)->DeleteLocalRef (env, native_library_dir_path);
+ }
+
+ if (application_info_object_class) {
+ (*env)->DeleteLocalRef (env, application_info_object_class);
+ }
+
+ if (application_info_object) {
+ (*env)->DeleteLocalRef (env, application_info_object);
+ }
+
+ if (context_class) {
+ (*env)->DeleteLocalRef (env, context_class);
+ }
+
+#endif
+
+ return ret;
+}
+
+/**
* @brief Initialize NNStreamer, register required plugins.
*/
jboolean
goto done;
}
+ if (!nns_set_env (env, context)) {
+ nns_loge ("Failed to set extra env");
+ goto done;
+ }
+
if (nns_is_initilaized == FALSE) {
/* register nnstreamer plugins */
#if !defined (NNS_SINGLE_ONLY)
fi
if [[ $enable_snpe == "yes" ]]; then
+ [ $enable_snap == "yes" ] && echo "DO NOT enable SNAP and SNPE both. The app would fail to use DSP or NPU runtime." && exit 1
[ -z "$SNPE_DIRECTORY" ] && echo "Need to set SNPE_DIRECTORY, to build sub-plugin for SNPE." && exit 1
[ $target_abi != "arm64-v8a" ] && echo "Set target ABI arm64-v8a to build sub-plugin for SNPE." && exit 1
if [[ $enable_snpe == "yes" ]]; then
sed -i "s|ENABLE_SNPE := false|ENABLE_SNPE := true|" external/Android-nnstreamer-prebuilt.mk
sed -i "s|ENABLE_SNPE := false|ENABLE_SNPE := true|" api/src/main/jni/Android.mk
- mkdir api/src/main/jni/snpe
+ sed -i "$ a SNPE_DSP_LIBRARY_PATH=src/main/jni/snpe/lib/dsp" gradle.properties
+ mkdir -p api/src/main/jni/snpe/lib/dsp/arm64-v8a
cp -r $SNPE_DIRECTORY/include api/src/main/jni/snpe
- cp -r $SNPE_DIRECTORY/lib api/src/main/jni/snpe
+ cp -r $SNPE_DIRECTORY/lib/aarch64-android-clang6.0 api/src/main/jni/snpe/lib/aarch64-android-clang6.0
+ cp $SNPE_DIRECTORY/lib/dsp/libsnpe*.so api/src/main/jni/snpe/lib/dsp/arm64-v8a
fi
# Update tf-lite option