Google Play 服务运行时中的 LiteRT 可让您 学习 (ML) 模型,而无需将 LiteRT 库静态捆绑到 。本指南介绍了如何使用适用于 Google 的 C API Play 服务。
在 Google Play 服务 C API 中使用 LiteRT 之前,请确保 您已安装 CMake 构建工具。
更新构建配置
将以下依赖项添加到您的应用项目代码中,以访问 Play 适用于 LiteRT 的服务 API:
implementation "com.google.android.gms:play-services-tflite-java:16.2.0-beta02"
然后,启用 预制件 功能,通过更新 android 代码块,从 CMake 脚本访问 C API (包含在模块的 build.gradle 文件中):
buildFeatures {
prefab = true
}
您最终需要添加导入的软件包 tensorflowlite_jni_gms_client
从 AAR 将其作为依赖项添加到 CMake 脚本中:
find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG)
target_link_libraries(tflite-jni # your JNI lib target
tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client
android # other deps for your target
log)
# Also add -DTFLITE_IN_GMSCORE -DTFLITE_WITH_STABLE_ABI
# to the C/C++ compiler flags.
add_compile_definitions(TFLITE_IN_GMSCORE)
add_compile_definitions(TFLITE_WITH_STABLE_ABI)
初始化 LiteRT 运行时
在调用 LiteRT Native API 之前,必须先初始化
TfLiteNative
运行时。
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
使用 Google Play 服务 Task API,TfLiteNative.initialize
将 TFLite 运行时从 Google Play 服务异步加载到您的
应用的运行时进程使用 addOnSuccessListener()
确保
TfLite.initialize()
任务在执行代码之前完成,
LiteRT API。成功完成任务后,您可以调用
所有可用的 TFLite 原生 API。
原生代码实现
如需通过原生代码在 Google Play 服务中使用 LiteRT,您可以执行以下操作: 以下项之一:
- 声明新的 JNI 函数以从 Java 代码中调用原生函数
- 从现有的原生 C 代码调用 LiteRT 原生 API。
JNI 函数:
您可以声明新的 JNI 函数,使 LiteRT 运行时声明 使用 Java/Kotlin 的代码访问任意原生代码,如下所示:
Java
package com.google.samples.gms.tflite.c; public class TfLiteJni { static { System.loadLibrary("tflite-jni"); } public TfLiteJni() { /**/ }; public native void loadModel(AssetManager assetManager, String assetName); public native float[] runInference(float[] input); }
Kotlin
package com.google.samples.gms.tflite.c class TfLiteJni() { companion object { init { System.loadLibrary("tflite-jni") } } external fun loadModel(assetManager: AssetManager, assetName: String) external fun runInference(input: FloatArray): FloatArray }
匹配以下 loadModel
和 runInference
原生函数:
#ifdef __cplusplus
extern "C" {
#endif
void Java_com_google_samples_gms_tflite_c_loadModel(
JNIEnv *env, jobject tflite_jni, jobject asset_manager, jstring asset_name){
//...
}
jfloatArray Java_com_google_samples_gms_tflite_c_TfLiteJni_runInference(
JNIEnv* env, jobject tfliteJni, jfloatArray input) {
//...
}
#ifdef __cplusplus
} // extern "C".
#endif
然后,您可以从 Java/Kotlin 代码调用 C 函数:
Java
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Kotlin
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
C 代码中的 LiteRT
添加相应的 API 头文件,以便在 Google Play 中包含 TfLite 服务 API:
#include "tensorflow/lite/c/c_api.h"
然后,您可以使用常规的 LiteRT C API:
auto model = TfLiteModelCreate(model_asset, model_asset_length);
// ...
auto options = TfLiteInterpreterOptionsCreate();
// ...
auto interpreter = TfLiteInterpreterCreate(model, options);
带有 Google Play 服务原生 API 标头的 LiteRT 提供
与常规 API 相同的 API
LiteRT C API,不包括
已弃用或实验性功能目前这些函数和类型
(来自 c_api.h
、c_api_types.h
和 common.h
标头)。请
请注意,不支持 c_api_experimental.h
标头中的函数。
您可以通过执行以下操作,将 LiteRT 特有的功能与 Google Play 服务搭配使用
包括tflite.h
。