Mit LiteRT in der Google Play-Dienstlaufzeit können Sie Modelle für maschinelles Lernen ausführen, ohne LiteRT-Bibliotheken statisch in Ihre App einzubinden. In diesem Leitfaden erfahren Sie, wie Sie die C- oder C++-APIs für Google Play-Dienste verwenden.
Bevor Sie mit der LiteRT in der C API oder C++ API von Google Play-Diensten arbeiten, müssen Sie das Build-Tool CMake installiert haben.
Buildkonfiguration aktualisieren
(1) Fügen Sie dem Code Ihres App-Projekts die folgenden Abhängigkeiten hinzu, um auf die Play-Dienste API für LiteRT zuzugreifen:
implementation "com.google.android.gms:play-services-tflite-java:16.4.0"
Obwohl der Paketname auf -java
endet, enthält dieses Paket auch die C- und C++-APIs.
(2) Aktivieren Sie dann die Funktion Prefab, um über Ihr CMake-Script auf die C API zuzugreifen. Aktualisieren Sie dazu den Android-Block der build.gradle-Datei Ihres Moduls:
buildFeatures {
prefab = true
}
(3) [Nur C++ API] Wenn Sie die C++ API verwenden, kopieren Sie tflite-java-extract-cpp-sdk.gradle in Ihr Projekt in das Verzeichnis app
und fügen Sie am Anfang des Gradle-Scripts Ihrer App (z.B. app/build.gradle
) Folgendes hinzu:
apply from: 'tflite-java-extract-cpp-sdk.gradle'
Dieser enthält Gradle-Code, mit dem das C++ SDK automatisch aus der AAR-Datei für play-services-tflite-java
entpackt wird.
(4) [Nur C++ API] Wenn Sie die C++ API verwenden, suchen Sie das Verzeichnis mit der CMake-Konfigurationsdatei Ihrer App (normalerweise CMakeLists.txt
). Dieses Verzeichnis ist normalerweise das Verzeichnis app/src/main/cpp
. Kopieren Sie dann Findtflite_cc_api.cmake in Ihr Projekt in ein neues Unterverzeichnis Modules
dieses Verzeichnisses.
Dieser enthält Code, mit dem das C++ SDK gefunden wird, das im vorherigen Schritt durch das Gradle-Script entpackt wurde.
(5) Fügen Sie abschließend das Paket tensorflowlite_jni_gms_client
und für die C++ API auch das Paket tflite_cc_api
hinzu, die beide aus dem AAR importiert werden, als Abhängigkeiten in Ihr CMake-Script:
C
``` find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # C/C++-Compiler-Flags einrichten, um die Verwendung von TFLite in Play-Diensten zu ermöglichen # (anstelle der regulären TFLite-Bibliothek, die mit der App gebündelt ist). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # your JNI lib target tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # other deps for your target log) ```C++
``` # TFLite in der Play-Dienste-C API (tensorflowlite_jni_gms_client) als Abhängigkeit einrichten. find_package(tensorflowlite_jni_gms_client REQUIRED CONFIG) # TFLite in der Play-Dienste-C++ API (tflite_cc_api) einrichten. list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules") find_package(tflite_cc_api REQUIRED MODULE) include_directories(${tflite_cc_api_INCLUDE_DIR}) add_subdirectory(${tflite_cc_api_DIR} tflite_cc_api_build) # Set up C/C++ compiler flags to enable use of TFLite in Play services # (rather than regular TFLite bundled with the app). add_compile_definitions(TFLITE_IN_GMSCORE) add_compile_definitions(TFLITE_WITH_STABLE_ABI) target_link_libraries(tflite-jni # your JNI lib target tflite_cc_api::tflite_cc_api tensorflowlite_jni_gms_client::tensorflowlite_jni_gms_client android # other deps for your target log) ```LiteRT-Laufzeit initialisieren
Bevor Sie die LiteRT Native API aufrufen, müssen Sie die TfLiteNative
-Laufzeit in Ihrem Java- oder Kotlin-Code initialisieren.
Java
Task tfLiteInitializeTask = TfLiteNative.initialize(context);
Kotlin
val tfLiteInitializeTask: Task= TfLiteNative.initialize(context)
Mit der Task API von Google Play-Diensten lädt TfLiteNative.initialize
die TFLite-Laufzeit asynchron aus den Google Play-Diensten in den Laufzeitprozess Ihrer Anwendung. Mit addOnSuccessListener()
kannst du dafür sorgen, dass die Aufgabe TfLite.initialize()
abgeschlossen ist, bevor Code ausgeführt wird, der auf LiteRT APIs zugreift. Sobald die Aufgabe abgeschlossen ist, können Sie alle verfügbaren TFLite Native APIs aufrufen.
Native Code-Implementierung
Sie haben folgende Möglichkeiten, LiteRT in Google Play-Diensten mit Ihrem C/C++-Code zu verwenden:
- neue JNI-Funktionen deklarieren, um C- oder C++-Funktionen aus Ihrem Java-Code aufzurufen
- die LiteRT Native API aus Ihrem vorhandenen C- oder C++-Code aufrufen.
JNI-Funktionen
Sie können neue JNI-Funktionen deklarieren, um die in C/C++-Code deklarierte LiteRT-Laufzeit für Ihren Java-/Kotlin-Code zugänglich zu machen. Gehen Sie dazu so vor:
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); // For example. }
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 // For example. }
Übereinstimmung mit den folgenden loadModel
- und runInference
-C- oder C++-Funktionen:
#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
Sie können Ihre C/C++-Funktionen dann aus Ihrem Java-/Kotlin-Code aufrufen:
Java
tfLiteHandleTask.onSuccessTask(unused -> { TfLiteJni jni = new TfLiteJni(); jni.loadModel(getAssets(), "add.bin"); //... });
Kotlin
tfLiteHandleTask.onSuccessTask { val jni = TfLiteJni() jni.loadModel(assets, "add.bin") // ... }
LiteRT in nativem Code
Fügen Sie die entsprechende API-Headerdatei ein, um LiteRT in die Google Play Services API einzubinden:
C
``` #include "tensorflow/lite/c/c_api.h" ```C++
``` #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/model_builder.h" ```Sie können dann die reguläre LiteRT C- oder C++-API verwenden: