1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker *
4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker *
8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker *
10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker */
16*993b0882SAndroid Build Coastguard Worker
17*993b0882SAndroid Build Coastguard Worker // JNI wrapper for actions.
18*993b0882SAndroid Build Coastguard Worker
19*993b0882SAndroid Build Coastguard Worker #include "actions/actions_jni.h"
20*993b0882SAndroid Build Coastguard Worker
21*993b0882SAndroid Build Coastguard Worker #include <jni.h>
22*993b0882SAndroid Build Coastguard Worker
23*993b0882SAndroid Build Coastguard Worker #include <map>
24*993b0882SAndroid Build Coastguard Worker #include <type_traits>
25*993b0882SAndroid Build Coastguard Worker #include <vector>
26*993b0882SAndroid Build Coastguard Worker
27*993b0882SAndroid Build Coastguard Worker #include "actions/actions-suggestions.h"
28*993b0882SAndroid Build Coastguard Worker #include "annotator/annotator.h"
29*993b0882SAndroid Build Coastguard Worker #include "annotator/annotator_jni_common.h"
30*993b0882SAndroid Build Coastguard Worker #include "utils/base/integral_types.h"
31*993b0882SAndroid Build Coastguard Worker #include "utils/base/status_macros.h"
32*993b0882SAndroid Build Coastguard Worker #include "utils/base/statusor.h"
33*993b0882SAndroid Build Coastguard Worker #include "utils/intents/intent-generator.h"
34*993b0882SAndroid Build Coastguard Worker #include "utils/intents/jni.h"
35*993b0882SAndroid Build Coastguard Worker #include "utils/intents/remote-action-template.h"
36*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-base.h"
37*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-cache.h"
38*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-helper.h"
39*993b0882SAndroid Build Coastguard Worker #include "utils/memory/mmap.h"
40*993b0882SAndroid Build Coastguard Worker
41*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ActionsSuggestions;
42*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ActionsSuggestionsResponse;
43*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ActionSuggestionOptions;
44*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::Annotator;
45*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::Conversation;
46*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::IntentGenerator;
47*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::JStringToUtf8String;
48*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ScopedLocalRef;
49*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::StatusOr;
50*993b0882SAndroid Build Coastguard Worker
51*993b0882SAndroid Build Coastguard Worker // When using the Java's ICU, UniLib needs to be instantiated with a JavaVM
52*993b0882SAndroid Build Coastguard Worker // pointer from JNI. When using a standard ICU the pointer is not needed and the
53*993b0882SAndroid Build Coastguard Worker // objects are instantiated implicitly.
54*993b0882SAndroid Build Coastguard Worker #ifdef TC3_UNILIB_JAVAICU
55*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::UniLib;
56*993b0882SAndroid Build Coastguard Worker #endif
57*993b0882SAndroid Build Coastguard Worker
58*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
59*993b0882SAndroid Build Coastguard Worker
60*993b0882SAndroid Build Coastguard Worker namespace {
61*993b0882SAndroid Build Coastguard Worker
62*993b0882SAndroid Build Coastguard Worker // Cached state for model inference.
63*993b0882SAndroid Build Coastguard Worker // Keeps a jni cache, intent generator and model instance so that they don't
64*993b0882SAndroid Build Coastguard Worker // have to be recreated for each call.
65*993b0882SAndroid Build Coastguard Worker class ActionsSuggestionsJniContext {
66*993b0882SAndroid Build Coastguard Worker public:
Create(const std::shared_ptr<libtextclassifier3::JniCache> & jni_cache,std::unique_ptr<ActionsSuggestions> model)67*993b0882SAndroid Build Coastguard Worker static ActionsSuggestionsJniContext* Create(
68*993b0882SAndroid Build Coastguard Worker const std::shared_ptr<libtextclassifier3::JniCache>& jni_cache,
69*993b0882SAndroid Build Coastguard Worker std::unique_ptr<ActionsSuggestions> model) {
70*993b0882SAndroid Build Coastguard Worker if (jni_cache == nullptr || model == nullptr) {
71*993b0882SAndroid Build Coastguard Worker return nullptr;
72*993b0882SAndroid Build Coastguard Worker }
73*993b0882SAndroid Build Coastguard Worker std::unique_ptr<IntentGenerator> intent_generator =
74*993b0882SAndroid Build Coastguard Worker IntentGenerator::Create(model->model()->android_intent_options(),
75*993b0882SAndroid Build Coastguard Worker model->model()->resources(), jni_cache);
76*993b0882SAndroid Build Coastguard Worker if (intent_generator == nullptr) {
77*993b0882SAndroid Build Coastguard Worker return nullptr;
78*993b0882SAndroid Build Coastguard Worker }
79*993b0882SAndroid Build Coastguard Worker
80*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
81*993b0882SAndroid Build Coastguard Worker std::unique_ptr<RemoteActionTemplatesHandler> template_handler,
82*993b0882SAndroid Build Coastguard Worker libtextclassifier3::RemoteActionTemplatesHandler::Create(jni_cache));
83*993b0882SAndroid Build Coastguard Worker
84*993b0882SAndroid Build Coastguard Worker return new ActionsSuggestionsJniContext(jni_cache, std::move(model),
85*993b0882SAndroid Build Coastguard Worker std::move(intent_generator),
86*993b0882SAndroid Build Coastguard Worker std::move(template_handler));
87*993b0882SAndroid Build Coastguard Worker }
88*993b0882SAndroid Build Coastguard Worker
jni_cache() const89*993b0882SAndroid Build Coastguard Worker std::shared_ptr<libtextclassifier3::JniCache> jni_cache() const {
90*993b0882SAndroid Build Coastguard Worker return jni_cache_;
91*993b0882SAndroid Build Coastguard Worker }
92*993b0882SAndroid Build Coastguard Worker
model() const93*993b0882SAndroid Build Coastguard Worker ActionsSuggestions* model() const { return model_.get(); }
94*993b0882SAndroid Build Coastguard Worker
intent_generator() const95*993b0882SAndroid Build Coastguard Worker IntentGenerator* intent_generator() const { return intent_generator_.get(); }
96*993b0882SAndroid Build Coastguard Worker
template_handler() const97*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler* template_handler() const {
98*993b0882SAndroid Build Coastguard Worker return template_handler_.get();
99*993b0882SAndroid Build Coastguard Worker }
100*993b0882SAndroid Build Coastguard Worker
101*993b0882SAndroid Build Coastguard Worker private:
ActionsSuggestionsJniContext(const std::shared_ptr<libtextclassifier3::JniCache> & jni_cache,std::unique_ptr<ActionsSuggestions> model,std::unique_ptr<IntentGenerator> intent_generator,std::unique_ptr<RemoteActionTemplatesHandler> template_handler)102*993b0882SAndroid Build Coastguard Worker ActionsSuggestionsJniContext(
103*993b0882SAndroid Build Coastguard Worker const std::shared_ptr<libtextclassifier3::JniCache>& jni_cache,
104*993b0882SAndroid Build Coastguard Worker std::unique_ptr<ActionsSuggestions> model,
105*993b0882SAndroid Build Coastguard Worker std::unique_ptr<IntentGenerator> intent_generator,
106*993b0882SAndroid Build Coastguard Worker std::unique_ptr<RemoteActionTemplatesHandler> template_handler)
107*993b0882SAndroid Build Coastguard Worker : jni_cache_(jni_cache),
108*993b0882SAndroid Build Coastguard Worker model_(std::move(model)),
109*993b0882SAndroid Build Coastguard Worker intent_generator_(std::move(intent_generator)),
110*993b0882SAndroid Build Coastguard Worker template_handler_(std::move(template_handler)) {}
111*993b0882SAndroid Build Coastguard Worker
112*993b0882SAndroid Build Coastguard Worker std::shared_ptr<libtextclassifier3::JniCache> jni_cache_;
113*993b0882SAndroid Build Coastguard Worker std::unique_ptr<ActionsSuggestions> model_;
114*993b0882SAndroid Build Coastguard Worker std::unique_ptr<IntentGenerator> intent_generator_;
115*993b0882SAndroid Build Coastguard Worker std::unique_ptr<RemoteActionTemplatesHandler> template_handler_;
116*993b0882SAndroid Build Coastguard Worker };
117*993b0882SAndroid Build Coastguard Worker
FromJavaActionSuggestionOptions(JNIEnv * env,jobject joptions)118*993b0882SAndroid Build Coastguard Worker ActionSuggestionOptions FromJavaActionSuggestionOptions(JNIEnv* env,
119*993b0882SAndroid Build Coastguard Worker jobject joptions) {
120*993b0882SAndroid Build Coastguard Worker ActionSuggestionOptions options = ActionSuggestionOptions::Default();
121*993b0882SAndroid Build Coastguard Worker return options;
122*993b0882SAndroid Build Coastguard Worker }
123*993b0882SAndroid Build Coastguard Worker
ActionSuggestionsToJObject(JNIEnv * env,const ActionsSuggestionsJniContext * context,jobject app_context,const reflection::Schema * annotations_entity_data_schema,const ActionsSuggestionsResponse & action_response,const Conversation & conversation,const jstring device_locales,const bool generate_intents)124*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobject>> ActionSuggestionsToJObject(
125*993b0882SAndroid Build Coastguard Worker JNIEnv* env, const ActionsSuggestionsJniContext* context,
126*993b0882SAndroid Build Coastguard Worker jobject app_context,
127*993b0882SAndroid Build Coastguard Worker const reflection::Schema* annotations_entity_data_schema,
128*993b0882SAndroid Build Coastguard Worker const ActionsSuggestionsResponse& action_response,
129*993b0882SAndroid Build Coastguard Worker const Conversation& conversation, const jstring device_locales,
130*993b0882SAndroid Build Coastguard Worker const bool generate_intents) {
131*993b0882SAndroid Build Coastguard Worker // Find the class ActionSuggestion.
132*993b0882SAndroid Build Coastguard Worker auto status_or_action_class = JniHelper::FindClass(
133*993b0882SAndroid Build Coastguard Worker env, TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR "$ActionSuggestion");
134*993b0882SAndroid Build Coastguard Worker if (!status_or_action_class.ok()) {
135*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Couldn't find ActionSuggestion class.";
136*993b0882SAndroid Build Coastguard Worker return status_or_action_class.status();
137*993b0882SAndroid Build Coastguard Worker }
138*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jclass> action_class =
139*993b0882SAndroid Build Coastguard Worker std::move(status_or_action_class.ValueOrDie());
140*993b0882SAndroid Build Coastguard Worker
141*993b0882SAndroid Build Coastguard Worker // Find the class ActionSuggestions
142*993b0882SAndroid Build Coastguard Worker auto status_or_result_class = JniHelper::FindClass(
143*993b0882SAndroid Build Coastguard Worker env, TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR "$ActionSuggestions");
144*993b0882SAndroid Build Coastguard Worker if (!status_or_result_class.ok()) {
145*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Couldn't find ActionSuggestions class.";
146*993b0882SAndroid Build Coastguard Worker return status_or_result_class.status();
147*993b0882SAndroid Build Coastguard Worker }
148*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jclass> result_class =
149*993b0882SAndroid Build Coastguard Worker std::move(status_or_result_class.ValueOrDie());
150*993b0882SAndroid Build Coastguard Worker
151*993b0882SAndroid Build Coastguard Worker // Find the class Slot.
152*993b0882SAndroid Build Coastguard Worker auto status_or_slot_class = JniHelper::FindClass(
153*993b0882SAndroid Build Coastguard Worker env, TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR "$Slot");
154*993b0882SAndroid Build Coastguard Worker if (!status_or_slot_class.ok()) {
155*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Couldn't find Slot class.";
156*993b0882SAndroid Build Coastguard Worker return status_or_slot_class.status();
157*993b0882SAndroid Build Coastguard Worker }
158*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jclass> slot_class =
159*993b0882SAndroid Build Coastguard Worker std::move(status_or_slot_class.ValueOrDie());
160*993b0882SAndroid Build Coastguard Worker
161*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
162*993b0882SAndroid Build Coastguard Worker const jmethodID action_class_constructor,
163*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(
164*993b0882SAndroid Build Coastguard Worker env, action_class.get(), "<init>",
165*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;Ljava/lang/String;F[L" TC3_PACKAGE_PATH
166*993b0882SAndroid Build Coastguard Worker TC3_NAMED_VARIANT_CLASS_NAME_STR
167*993b0882SAndroid Build Coastguard Worker ";[B[L" TC3_PACKAGE_PATH TC3_REMOTE_ACTION_TEMPLATE_CLASS_NAME_STR
168*993b0882SAndroid Build Coastguard Worker ";[L" TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR "$Slot;)V"));
169*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(const jmethodID slot_class_constructor,
170*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, slot_class.get(), "<init>",
171*993b0882SAndroid Build Coastguard Worker "(Ljava/lang/String;IIIF)V"));
172*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
173*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobjectArray> actions,
174*993b0882SAndroid Build Coastguard Worker JniHelper::NewObjectArray(env, action_response.actions.size(),
175*993b0882SAndroid Build Coastguard Worker action_class.get(), nullptr));
176*993b0882SAndroid Build Coastguard Worker for (int i = 0; i < action_response.actions.size(); i++) {
177*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobjectArray> extras;
178*993b0882SAndroid Build Coastguard Worker const reflection::Schema* actions_entity_data_schema =
179*993b0882SAndroid Build Coastguard Worker context->model()->entity_data_schema();
180*993b0882SAndroid Build Coastguard Worker if (actions_entity_data_schema != nullptr &&
181*993b0882SAndroid Build Coastguard Worker !action_response.actions[i].serialized_entity_data.empty()) {
182*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
183*993b0882SAndroid Build Coastguard Worker extras, context->template_handler()->EntityDataAsNamedVariantArray(
184*993b0882SAndroid Build Coastguard Worker actions_entity_data_schema,
185*993b0882SAndroid Build Coastguard Worker action_response.actions[i].serialized_entity_data));
186*993b0882SAndroid Build Coastguard Worker }
187*993b0882SAndroid Build Coastguard Worker
188*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jbyteArray> serialized_entity_data;
189*993b0882SAndroid Build Coastguard Worker if (!action_response.actions[i].serialized_entity_data.empty()) {
190*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
191*993b0882SAndroid Build Coastguard Worker serialized_entity_data,
192*993b0882SAndroid Build Coastguard Worker JniHelper::NewByteArray(
193*993b0882SAndroid Build Coastguard Worker env, action_response.actions[i].serialized_entity_data.size()));
194*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_ERROR(JniHelper::SetByteArrayRegion(
195*993b0882SAndroid Build Coastguard Worker env, serialized_entity_data.get(), 0,
196*993b0882SAndroid Build Coastguard Worker action_response.actions[i].serialized_entity_data.size(),
197*993b0882SAndroid Build Coastguard Worker reinterpret_cast<const jbyte*>(
198*993b0882SAndroid Build Coastguard Worker action_response.actions[i].serialized_entity_data.data())));
199*993b0882SAndroid Build Coastguard Worker }
200*993b0882SAndroid Build Coastguard Worker
201*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobjectArray> remote_action_templates_result;
202*993b0882SAndroid Build Coastguard Worker if (generate_intents) {
203*993b0882SAndroid Build Coastguard Worker std::vector<RemoteActionTemplate> remote_action_templates;
204*993b0882SAndroid Build Coastguard Worker if (context->intent_generator()->GenerateIntents(
205*993b0882SAndroid Build Coastguard Worker device_locales, action_response.actions[i], conversation,
206*993b0882SAndroid Build Coastguard Worker app_context,
207*993b0882SAndroid Build Coastguard Worker /*annotations_entity_data_schema=*/annotations_entity_data_schema,
208*993b0882SAndroid Build Coastguard Worker /*actions_entity_data_schema=*/actions_entity_data_schema,
209*993b0882SAndroid Build Coastguard Worker &remote_action_templates)) {
210*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
211*993b0882SAndroid Build Coastguard Worker remote_action_templates_result,
212*993b0882SAndroid Build Coastguard Worker context->template_handler()->RemoteActionTemplatesToJObjectArray(
213*993b0882SAndroid Build Coastguard Worker remote_action_templates));
214*993b0882SAndroid Build Coastguard Worker }
215*993b0882SAndroid Build Coastguard Worker }
216*993b0882SAndroid Build Coastguard Worker
217*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> reply,
218*993b0882SAndroid Build Coastguard Worker context->jni_cache()->ConvertToJavaString(
219*993b0882SAndroid Build Coastguard Worker action_response.actions[i].response_text));
220*993b0882SAndroid Build Coastguard Worker
221*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
222*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> action_type,
223*993b0882SAndroid Build Coastguard Worker JniHelper::NewStringUTF(env, action_response.actions[i].type.c_str()));
224*993b0882SAndroid Build Coastguard Worker
225*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobjectArray> slots;
226*993b0882SAndroid Build Coastguard Worker if (!action_response.actions[i].slots.empty()) {
227*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(slots,
228*993b0882SAndroid Build Coastguard Worker JniHelper::NewObjectArray(
229*993b0882SAndroid Build Coastguard Worker env, action_response.actions[i].slots.size(),
230*993b0882SAndroid Build Coastguard Worker slot_class.get(), nullptr));
231*993b0882SAndroid Build Coastguard Worker for (int j = 0; j < action_response.actions[i].slots.size(); j++) {
232*993b0882SAndroid Build Coastguard Worker const Slot& slot_c = action_response.actions[i].slots[j];
233*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> slot_type,
234*993b0882SAndroid Build Coastguard Worker JniHelper::NewStringUTF(env, slot_c.type.c_str()));
235*993b0882SAndroid Build Coastguard Worker
236*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
237*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> slot,
238*993b0882SAndroid Build Coastguard Worker JniHelper::NewObject(
239*993b0882SAndroid Build Coastguard Worker env, slot_class.get(), slot_class_constructor, slot_type.get(),
240*993b0882SAndroid Build Coastguard Worker slot_c.span.message_index, slot_c.span.span.first,
241*993b0882SAndroid Build Coastguard Worker slot_c.span.span.second, slot_c.confidence_score));
242*993b0882SAndroid Build Coastguard Worker
243*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_ERROR(
244*993b0882SAndroid Build Coastguard Worker JniHelper::SetObjectArrayElement(env, slots.get(), j, slot.get()));
245*993b0882SAndroid Build Coastguard Worker }
246*993b0882SAndroid Build Coastguard Worker }
247*993b0882SAndroid Build Coastguard Worker
248*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
249*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> action,
250*993b0882SAndroid Build Coastguard Worker JniHelper::NewObject(
251*993b0882SAndroid Build Coastguard Worker env, action_class.get(), action_class_constructor, reply.get(),
252*993b0882SAndroid Build Coastguard Worker action_type.get(),
253*993b0882SAndroid Build Coastguard Worker static_cast<jfloat>(action_response.actions[i].score), extras.get(),
254*993b0882SAndroid Build Coastguard Worker serialized_entity_data.get(), remote_action_templates_result.get(),
255*993b0882SAndroid Build Coastguard Worker slots.get()));
256*993b0882SAndroid Build Coastguard Worker TC3_RETURN_IF_ERROR(
257*993b0882SAndroid Build Coastguard Worker JniHelper::SetObjectArrayElement(env, actions.get(), i, action.get()));
258*993b0882SAndroid Build Coastguard Worker }
259*993b0882SAndroid Build Coastguard Worker
260*993b0882SAndroid Build Coastguard Worker // Create the ActionSuggestions object.
261*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
262*993b0882SAndroid Build Coastguard Worker const jmethodID result_class_constructor,
263*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, result_class.get(), "<init>",
264*993b0882SAndroid Build Coastguard Worker "([L" TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR
265*993b0882SAndroid Build Coastguard Worker "$ActionSuggestion;Z)V"));
266*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
267*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> result,
268*993b0882SAndroid Build Coastguard Worker JniHelper::NewObject(env, result_class.get(), result_class_constructor,
269*993b0882SAndroid Build Coastguard Worker actions.get(), action_response.is_sensitive));
270*993b0882SAndroid Build Coastguard Worker return result;
271*993b0882SAndroid Build Coastguard Worker }
272*993b0882SAndroid Build Coastguard Worker
FromJavaConversationMessage(JNIEnv * env,jobject jmessage)273*993b0882SAndroid Build Coastguard Worker StatusOr<ConversationMessage> FromJavaConversationMessage(JNIEnv* env,
274*993b0882SAndroid Build Coastguard Worker jobject jmessage) {
275*993b0882SAndroid Build Coastguard Worker if (!jmessage) {
276*993b0882SAndroid Build Coastguard Worker return {};
277*993b0882SAndroid Build Coastguard Worker }
278*993b0882SAndroid Build Coastguard Worker
279*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
280*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jclass> message_class,
281*993b0882SAndroid Build Coastguard Worker JniHelper::FindClass(env, TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR
282*993b0882SAndroid Build Coastguard Worker "$ConversationMessage"));
283*993b0882SAndroid Build Coastguard Worker // .getText()
284*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
285*993b0882SAndroid Build Coastguard Worker jmethodID get_text_method,
286*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, message_class.get(), "getText",
287*993b0882SAndroid Build Coastguard Worker "()Ljava/lang/String;"));
288*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
289*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> text,
290*993b0882SAndroid Build Coastguard Worker JniHelper::CallObjectMethod<jstring>(env, jmessage, get_text_method));
291*993b0882SAndroid Build Coastguard Worker
292*993b0882SAndroid Build Coastguard Worker // .getUserId()
293*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
294*993b0882SAndroid Build Coastguard Worker jmethodID get_user_id_method,
295*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, message_class.get(), "getUserId", "()I"));
296*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(int32 user_id, JniHelper::CallIntMethod(
297*993b0882SAndroid Build Coastguard Worker env, jmessage, get_user_id_method));
298*993b0882SAndroid Build Coastguard Worker
299*993b0882SAndroid Build Coastguard Worker // .getReferenceTimeMsUtc()
300*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(jmethodID get_reference_time_method,
301*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, message_class.get(),
302*993b0882SAndroid Build Coastguard Worker "getReferenceTimeMsUtc", "()J"));
303*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
304*993b0882SAndroid Build Coastguard Worker int64 reference_time,
305*993b0882SAndroid Build Coastguard Worker JniHelper::CallLongMethod(env, jmessage, get_reference_time_method));
306*993b0882SAndroid Build Coastguard Worker
307*993b0882SAndroid Build Coastguard Worker // .getReferenceTimezone()
308*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
309*993b0882SAndroid Build Coastguard Worker jmethodID get_reference_timezone_method,
310*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, message_class.get(), "getReferenceTimezone",
311*993b0882SAndroid Build Coastguard Worker "()Ljava/lang/String;"));
312*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> reference_timezone,
313*993b0882SAndroid Build Coastguard Worker JniHelper::CallObjectMethod<jstring>(
314*993b0882SAndroid Build Coastguard Worker env, jmessage, get_reference_timezone_method));
315*993b0882SAndroid Build Coastguard Worker
316*993b0882SAndroid Build Coastguard Worker // .getDetectedTextLanguageTags()
317*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(jmethodID get_detected_text_language_tags_method,
318*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, message_class.get(),
319*993b0882SAndroid Build Coastguard Worker "getDetectedTextLanguageTags",
320*993b0882SAndroid Build Coastguard Worker "()Ljava/lang/String;"));
321*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
322*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> detected_text_language_tags,
323*993b0882SAndroid Build Coastguard Worker JniHelper::CallObjectMethod<jstring>(
324*993b0882SAndroid Build Coastguard Worker env, jmessage, get_detected_text_language_tags_method));
325*993b0882SAndroid Build Coastguard Worker
326*993b0882SAndroid Build Coastguard Worker ConversationMessage message;
327*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(message.text, JStringToUtf8String(env, text.get()));
328*993b0882SAndroid Build Coastguard Worker message.user_id = user_id;
329*993b0882SAndroid Build Coastguard Worker message.reference_time_ms_utc = reference_time;
330*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(message.reference_timezone,
331*993b0882SAndroid Build Coastguard Worker JStringToUtf8String(env, reference_timezone.get()));
332*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
333*993b0882SAndroid Build Coastguard Worker message.detected_text_language_tags,
334*993b0882SAndroid Build Coastguard Worker JStringToUtf8String(env, detected_text_language_tags.get()));
335*993b0882SAndroid Build Coastguard Worker return message;
336*993b0882SAndroid Build Coastguard Worker }
337*993b0882SAndroid Build Coastguard Worker
FromJavaConversation(JNIEnv * env,jobject jconversation)338*993b0882SAndroid Build Coastguard Worker StatusOr<Conversation> FromJavaConversation(JNIEnv* env,
339*993b0882SAndroid Build Coastguard Worker jobject jconversation) {
340*993b0882SAndroid Build Coastguard Worker if (!jconversation) {
341*993b0882SAndroid Build Coastguard Worker return {Status::UNKNOWN};
342*993b0882SAndroid Build Coastguard Worker }
343*993b0882SAndroid Build Coastguard Worker
344*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
345*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jclass> conversation_class,
346*993b0882SAndroid Build Coastguard Worker JniHelper::FindClass(
347*993b0882SAndroid Build Coastguard Worker env, TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR "$Conversation"));
348*993b0882SAndroid Build Coastguard Worker
349*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
350*993b0882SAndroid Build Coastguard Worker jmethodID get_conversation_messages_method,
351*993b0882SAndroid Build Coastguard Worker JniHelper::GetMethodID(env, conversation_class.get(),
352*993b0882SAndroid Build Coastguard Worker "getConversationMessages",
353*993b0882SAndroid Build Coastguard Worker "()[L" TC3_PACKAGE_PATH TC3_ACTIONS_CLASS_NAME_STR
354*993b0882SAndroid Build Coastguard Worker "$ConversationMessage;"));
355*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
356*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobjectArray> jmessages,
357*993b0882SAndroid Build Coastguard Worker JniHelper::CallObjectMethod<jobjectArray>(
358*993b0882SAndroid Build Coastguard Worker env, jconversation, get_conversation_messages_method));
359*993b0882SAndroid Build Coastguard Worker
360*993b0882SAndroid Build Coastguard Worker std::vector<ConversationMessage> messages;
361*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(const int size,
362*993b0882SAndroid Build Coastguard Worker JniHelper::GetArrayLength(env, jmessages.get()));
363*993b0882SAndroid Build Coastguard Worker for (int i = 0; i < size; i++) {
364*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(
365*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> jmessage,
366*993b0882SAndroid Build Coastguard Worker JniHelper::GetObjectArrayElement<jobject>(env, jmessages.get(), i));
367*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN(ConversationMessage message,
368*993b0882SAndroid Build Coastguard Worker FromJavaConversationMessage(env, jmessage.get()));
369*993b0882SAndroid Build Coastguard Worker messages.push_back(message);
370*993b0882SAndroid Build Coastguard Worker }
371*993b0882SAndroid Build Coastguard Worker Conversation conversation;
372*993b0882SAndroid Build Coastguard Worker conversation.messages = messages;
373*993b0882SAndroid Build Coastguard Worker return conversation;
374*993b0882SAndroid Build Coastguard Worker }
375*993b0882SAndroid Build Coastguard Worker
GetLocalesFromMmap(JNIEnv * env,libtextclassifier3::ScopedMmap * mmap)376*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> GetLocalesFromMmap(
377*993b0882SAndroid Build Coastguard Worker JNIEnv* env, libtextclassifier3::ScopedMmap* mmap) {
378*993b0882SAndroid Build Coastguard Worker if (!mmap->handle().ok()) {
379*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, "");
380*993b0882SAndroid Build Coastguard Worker }
381*993b0882SAndroid Build Coastguard Worker const ActionsModel* model = libtextclassifier3::ViewActionsModel(
382*993b0882SAndroid Build Coastguard Worker mmap->handle().start(), mmap->handle().num_bytes());
383*993b0882SAndroid Build Coastguard Worker if (!model || !model->locales()) {
384*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, "");
385*993b0882SAndroid Build Coastguard Worker }
386*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, model->locales()->c_str());
387*993b0882SAndroid Build Coastguard Worker }
388*993b0882SAndroid Build Coastguard Worker
GetVersionFromMmap(JNIEnv * env,libtextclassifier3::ScopedMmap * mmap)389*993b0882SAndroid Build Coastguard Worker jint GetVersionFromMmap(JNIEnv* env, libtextclassifier3::ScopedMmap* mmap) {
390*993b0882SAndroid Build Coastguard Worker if (!mmap->handle().ok()) {
391*993b0882SAndroid Build Coastguard Worker return 0;
392*993b0882SAndroid Build Coastguard Worker }
393*993b0882SAndroid Build Coastguard Worker const ActionsModel* model = libtextclassifier3::ViewActionsModel(
394*993b0882SAndroid Build Coastguard Worker mmap->handle().start(), mmap->handle().num_bytes());
395*993b0882SAndroid Build Coastguard Worker if (!model) {
396*993b0882SAndroid Build Coastguard Worker return 0;
397*993b0882SAndroid Build Coastguard Worker }
398*993b0882SAndroid Build Coastguard Worker return model->version();
399*993b0882SAndroid Build Coastguard Worker }
400*993b0882SAndroid Build Coastguard Worker
GetNameFromMmap(JNIEnv * env,libtextclassifier3::ScopedMmap * mmap)401*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> GetNameFromMmap(
402*993b0882SAndroid Build Coastguard Worker JNIEnv* env, libtextclassifier3::ScopedMmap* mmap) {
403*993b0882SAndroid Build Coastguard Worker if (!mmap->handle().ok()) {
404*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, "");
405*993b0882SAndroid Build Coastguard Worker }
406*993b0882SAndroid Build Coastguard Worker const ActionsModel* model = libtextclassifier3::ViewActionsModel(
407*993b0882SAndroid Build Coastguard Worker mmap->handle().start(), mmap->handle().num_bytes());
408*993b0882SAndroid Build Coastguard Worker if (!model || !model->name()) {
409*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, "");
410*993b0882SAndroid Build Coastguard Worker }
411*993b0882SAndroid Build Coastguard Worker return JniHelper::NewStringUTF(env, model->name()->c_str());
412*993b0882SAndroid Build Coastguard Worker }
413*993b0882SAndroid Build Coastguard Worker } // namespace
414*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3
415*993b0882SAndroid Build Coastguard Worker
416*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ActionsSuggestionsJniContext;
417*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::ActionSuggestionsToJObject;
418*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::FromJavaActionSuggestionOptions;
419*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::FromJavaConversation;
420*993b0882SAndroid Build Coastguard Worker using libtextclassifier3::JByteArrayToString;
421*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jlong,TC3_ACTIONS_CLASS_NAME,nativeNewActionsModel)422*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jlong, TC3_ACTIONS_CLASS_NAME, nativeNewActionsModel)
423*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd, jbyteArray jserialized_preconditions) {
424*993b0882SAndroid Build Coastguard Worker std::shared_ptr<libtextclassifier3::JniCache> jni_cache =
425*993b0882SAndroid Build Coastguard Worker libtextclassifier3::JniCache::Create(env);
426*993b0882SAndroid Build Coastguard Worker std::string serialized_preconditions;
427*993b0882SAndroid Build Coastguard Worker if (jserialized_preconditions != nullptr) {
428*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_0(
429*993b0882SAndroid Build Coastguard Worker serialized_preconditions,
430*993b0882SAndroid Build Coastguard Worker JByteArrayToString(env, jserialized_preconditions),
431*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Could not convert serialized preconditions.");
432*993b0882SAndroid Build Coastguard Worker }
433*993b0882SAndroid Build Coastguard Worker
434*993b0882SAndroid Build Coastguard Worker #ifdef TC3_UNILIB_JAVAICU
435*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
436*993b0882SAndroid Build Coastguard Worker jni_cache, ActionsSuggestions::FromFileDescriptor(
437*993b0882SAndroid Build Coastguard Worker fd, std::unique_ptr<UniLib>(new UniLib(jni_cache)),
438*993b0882SAndroid Build Coastguard Worker serialized_preconditions)));
439*993b0882SAndroid Build Coastguard Worker #else
440*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
441*993b0882SAndroid Build Coastguard Worker jni_cache, ActionsSuggestions::FromFileDescriptor(
442*993b0882SAndroid Build Coastguard Worker fd, /*unilib=*/nullptr, serialized_preconditions)));
443*993b0882SAndroid Build Coastguard Worker #endif // TC3_UNILIB_JAVAICU
444*993b0882SAndroid Build Coastguard Worker }
445*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jlong,TC3_ACTIONS_CLASS_NAME,nativeNewActionsModelFromPath)446*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jlong, TC3_ACTIONS_CLASS_NAME, nativeNewActionsModelFromPath)
447*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jstring path,
448*993b0882SAndroid Build Coastguard Worker jbyteArray jserialized_preconditions) {
449*993b0882SAndroid Build Coastguard Worker std::shared_ptr<libtextclassifier3::JniCache> jni_cache =
450*993b0882SAndroid Build Coastguard Worker libtextclassifier3::JniCache::Create(env);
451*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_0(const std::string path_str,
452*993b0882SAndroid Build Coastguard Worker JStringToUtf8String(env, path));
453*993b0882SAndroid Build Coastguard Worker std::string serialized_preconditions;
454*993b0882SAndroid Build Coastguard Worker if (jserialized_preconditions != nullptr) {
455*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_0(
456*993b0882SAndroid Build Coastguard Worker serialized_preconditions,
457*993b0882SAndroid Build Coastguard Worker JByteArrayToString(env, jserialized_preconditions),
458*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Could not convert serialized preconditions.");
459*993b0882SAndroid Build Coastguard Worker }
460*993b0882SAndroid Build Coastguard Worker #ifdef TC3_UNILIB_JAVAICU
461*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
462*993b0882SAndroid Build Coastguard Worker jni_cache, ActionsSuggestions::FromPath(
463*993b0882SAndroid Build Coastguard Worker path_str, std::unique_ptr<UniLib>(new UniLib(jni_cache)),
464*993b0882SAndroid Build Coastguard Worker serialized_preconditions)));
465*993b0882SAndroid Build Coastguard Worker #else
466*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
467*993b0882SAndroid Build Coastguard Worker jni_cache, ActionsSuggestions::FromPath(path_str, /*unilib=*/nullptr,
468*993b0882SAndroid Build Coastguard Worker serialized_preconditions)));
469*993b0882SAndroid Build Coastguard Worker #endif // TC3_UNILIB_JAVAICU
470*993b0882SAndroid Build Coastguard Worker }
471*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jlong,TC3_ACTIONS_CLASS_NAME,nativeNewActionsModelWithOffset)472*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jlong, TC3_ACTIONS_CLASS_NAME, nativeNewActionsModelWithOffset)
473*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd, jlong offset, jlong size,
474*993b0882SAndroid Build Coastguard Worker jbyteArray jserialized_preconditions) {
475*993b0882SAndroid Build Coastguard Worker std::shared_ptr<libtextclassifier3::JniCache> jni_cache =
476*993b0882SAndroid Build Coastguard Worker libtextclassifier3::JniCache::Create(env);
477*993b0882SAndroid Build Coastguard Worker std::string serialized_preconditions;
478*993b0882SAndroid Build Coastguard Worker if (jserialized_preconditions != nullptr) {
479*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_0(
480*993b0882SAndroid Build Coastguard Worker serialized_preconditions,
481*993b0882SAndroid Build Coastguard Worker JByteArrayToString(env, jserialized_preconditions),
482*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Could not convert serialized preconditions.");
483*993b0882SAndroid Build Coastguard Worker }
484*993b0882SAndroid Build Coastguard Worker #ifdef TC3_UNILIB_JAVAICU
485*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
486*993b0882SAndroid Build Coastguard Worker jni_cache,
487*993b0882SAndroid Build Coastguard Worker ActionsSuggestions::FromFileDescriptor(
488*993b0882SAndroid Build Coastguard Worker fd, offset, size, std::unique_ptr<UniLib>(new UniLib(jni_cache)),
489*993b0882SAndroid Build Coastguard Worker serialized_preconditions)));
490*993b0882SAndroid Build Coastguard Worker #else
491*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(ActionsSuggestionsJniContext::Create(
492*993b0882SAndroid Build Coastguard Worker jni_cache,
493*993b0882SAndroid Build Coastguard Worker ActionsSuggestions::FromFileDescriptor(
494*993b0882SAndroid Build Coastguard Worker fd, offset, size, /*unilib=*/nullptr, serialized_preconditions)));
495*993b0882SAndroid Build Coastguard Worker #endif // TC3_UNILIB_JAVAICU
496*993b0882SAndroid Build Coastguard Worker }
497*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jobject,TC3_ACTIONS_CLASS_NAME,nativeSuggestActions)498*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jobject, TC3_ACTIONS_CLASS_NAME, nativeSuggestActions)
499*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject thiz, jlong ptr, jobject jconversation, jobject joptions,
500*993b0882SAndroid Build Coastguard Worker jlong annotatorPtr, jobject app_context, jstring device_locales,
501*993b0882SAndroid Build Coastguard Worker jboolean generate_intents) {
502*993b0882SAndroid Build Coastguard Worker if (!ptr) {
503*993b0882SAndroid Build Coastguard Worker return nullptr;
504*993b0882SAndroid Build Coastguard Worker }
505*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(const Conversation conversation,
506*993b0882SAndroid Build Coastguard Worker FromJavaConversation(env, jconversation));
507*993b0882SAndroid Build Coastguard Worker const ActionSuggestionOptions options =
508*993b0882SAndroid Build Coastguard Worker FromJavaActionSuggestionOptions(env, joptions);
509*993b0882SAndroid Build Coastguard Worker const ActionsSuggestionsJniContext* context =
510*993b0882SAndroid Build Coastguard Worker reinterpret_cast<ActionsSuggestionsJniContext*>(ptr);
511*993b0882SAndroid Build Coastguard Worker const Annotator* annotator = reinterpret_cast<Annotator*>(annotatorPtr);
512*993b0882SAndroid Build Coastguard Worker
513*993b0882SAndroid Build Coastguard Worker const ActionsSuggestionsResponse response =
514*993b0882SAndroid Build Coastguard Worker context->model()->SuggestActions(conversation, annotator, options);
515*993b0882SAndroid Build Coastguard Worker
516*993b0882SAndroid Build Coastguard Worker const reflection::Schema* anntotations_entity_data_schema =
517*993b0882SAndroid Build Coastguard Worker annotator ? annotator->entity_data_schema() : nullptr;
518*993b0882SAndroid Build Coastguard Worker
519*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
520*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jobject> result,
521*993b0882SAndroid Build Coastguard Worker ActionSuggestionsToJObject(
522*993b0882SAndroid Build Coastguard Worker env, context, app_context, anntotations_entity_data_schema, response,
523*993b0882SAndroid Build Coastguard Worker conversation, device_locales, generate_intents));
524*993b0882SAndroid Build Coastguard Worker return result.release();
525*993b0882SAndroid Build Coastguard Worker }
526*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(void,TC3_ACTIONS_CLASS_NAME,nativeCloseActionsModel)527*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(void, TC3_ACTIONS_CLASS_NAME, nativeCloseActionsModel)
528*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject thiz, jlong model_ptr) {
529*993b0882SAndroid Build Coastguard Worker const ActionsSuggestionsJniContext* context =
530*993b0882SAndroid Build Coastguard Worker reinterpret_cast<ActionsSuggestionsJniContext*>(model_ptr);
531*993b0882SAndroid Build Coastguard Worker delete context;
532*993b0882SAndroid Build Coastguard Worker }
533*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jstring,TC3_ACTIONS_CLASS_NAME,nativeGetLocales)534*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jstring, TC3_ACTIONS_CLASS_NAME, nativeGetLocales)
535*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd) {
536*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
537*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd));
538*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
539*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> result,
540*993b0882SAndroid Build Coastguard Worker libtextclassifier3::GetLocalesFromMmap(env, mmap.get()));
541*993b0882SAndroid Build Coastguard Worker return result.release();
542*993b0882SAndroid Build Coastguard Worker }
543*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jstring,TC3_ACTIONS_CLASS_NAME,nativeGetLocalesWithOffset)544*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jstring, TC3_ACTIONS_CLASS_NAME, nativeGetLocalesWithOffset)
545*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd, jlong offset, jlong size) {
546*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
547*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd, offset, size));
548*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
549*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> result,
550*993b0882SAndroid Build Coastguard Worker libtextclassifier3::GetLocalesFromMmap(env, mmap.get()));
551*993b0882SAndroid Build Coastguard Worker return result.release();
552*993b0882SAndroid Build Coastguard Worker }
553*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jstring,TC3_ACTIONS_CLASS_NAME,nativeGetName)554*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jstring, TC3_ACTIONS_CLASS_NAME, nativeGetName)
555*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd) {
556*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
557*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd));
558*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
559*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> result,
560*993b0882SAndroid Build Coastguard Worker libtextclassifier3::GetNameFromMmap(env, mmap.get()));
561*993b0882SAndroid Build Coastguard Worker return result.release();
562*993b0882SAndroid Build Coastguard Worker }
563*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jstring,TC3_ACTIONS_CLASS_NAME,nativeGetNameWithOffset)564*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jstring, TC3_ACTIONS_CLASS_NAME, nativeGetNameWithOffset)
565*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd, jlong offset, jlong size) {
566*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
567*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd, offset, size));
568*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_NULL(
569*993b0882SAndroid Build Coastguard Worker ScopedLocalRef<jstring> result,
570*993b0882SAndroid Build Coastguard Worker libtextclassifier3::GetNameFromMmap(env, mmap.get()));
571*993b0882SAndroid Build Coastguard Worker return result.release();
572*993b0882SAndroid Build Coastguard Worker }
573*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jint,TC3_ACTIONS_CLASS_NAME,nativeGetVersion)574*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jint, TC3_ACTIONS_CLASS_NAME, nativeGetVersion)
575*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd) {
576*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
577*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd));
578*993b0882SAndroid Build Coastguard Worker return libtextclassifier3::GetVersionFromMmap(env, mmap.get());
579*993b0882SAndroid Build Coastguard Worker }
580*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jint,TC3_ACTIONS_CLASS_NAME,nativeGetVersionWithOffset)581*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jint, TC3_ACTIONS_CLASS_NAME, nativeGetVersionWithOffset)
582*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject clazz, jint fd, jlong offset, jlong size) {
583*993b0882SAndroid Build Coastguard Worker const std::unique_ptr<libtextclassifier3::ScopedMmap> mmap(
584*993b0882SAndroid Build Coastguard Worker new libtextclassifier3::ScopedMmap(fd, offset, size));
585*993b0882SAndroid Build Coastguard Worker return libtextclassifier3::GetVersionFromMmap(env, mmap.get());
586*993b0882SAndroid Build Coastguard Worker }
587*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jlong,TC3_ACTIONS_CLASS_NAME,nativeGetNativeModelPtr)588*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jlong, TC3_ACTIONS_CLASS_NAME, nativeGetNativeModelPtr)
589*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject thiz, jlong ptr) {
590*993b0882SAndroid Build Coastguard Worker if (!ptr) {
591*993b0882SAndroid Build Coastguard Worker return 0L;
592*993b0882SAndroid Build Coastguard Worker }
593*993b0882SAndroid Build Coastguard Worker return reinterpret_cast<jlong>(
594*993b0882SAndroid Build Coastguard Worker reinterpret_cast<ActionsSuggestionsJniContext*>(ptr)->model());
595*993b0882SAndroid Build Coastguard Worker }
596*993b0882SAndroid Build Coastguard Worker
TC3_JNI_METHOD(jboolean,TC3_ACTIONS_CLASS_NAME,nativeInitializeConversationIntentDetection)597*993b0882SAndroid Build Coastguard Worker TC3_JNI_METHOD(jboolean, TC3_ACTIONS_CLASS_NAME,
598*993b0882SAndroid Build Coastguard Worker nativeInitializeConversationIntentDetection)
599*993b0882SAndroid Build Coastguard Worker (JNIEnv* env, jobject thiz, jlong ptr, jbyteArray jserialized_config) {
600*993b0882SAndroid Build Coastguard Worker if (!ptr) {
601*993b0882SAndroid Build Coastguard Worker return false;
602*993b0882SAndroid Build Coastguard Worker }
603*993b0882SAndroid Build Coastguard Worker
604*993b0882SAndroid Build Coastguard Worker ActionsSuggestions* model =
605*993b0882SAndroid Build Coastguard Worker reinterpret_cast<ActionsSuggestionsJniContext*>(ptr)->model();
606*993b0882SAndroid Build Coastguard Worker
607*993b0882SAndroid Build Coastguard Worker std::string serialized_config;
608*993b0882SAndroid Build Coastguard Worker TC3_ASSIGN_OR_RETURN_0(
609*993b0882SAndroid Build Coastguard Worker serialized_config, JByteArrayToString(env, jserialized_config),
610*993b0882SAndroid Build Coastguard Worker TC3_LOG(ERROR) << "Could not convert serialized conversation intent "
611*993b0882SAndroid Build Coastguard Worker "detection config.");
612*993b0882SAndroid Build Coastguard Worker return model->InitializeConversationIntentDetection(serialized_config);
613*993b0882SAndroid Build Coastguard Worker }
614