@@ -89,6 +89,7 @@ limitations under the License.
89
89
{ {$javaClassConverter } }::fill{ {Camel .Type } }(Env, { {$javaPropName } }, { {$local_value } });
90
90
{ {- end } }
91
91
{ {- end } }
92
+
92
93
#include "{ {$ModuleName } }/Generated/Jni/{ {$Iface } }JniClient.h"
93
94
#include "{ {$ModuleName } }/Generated/Jni/{ {$ModuleName } }FromJavaConverter.h"
94
95
{ { if or (len .Module.Enums) (len .Module.Structs) -} }
@@ -171,6 +172,7 @@ void {{$Class}}::Initialize(FSubsystemCollectionBase& Collection)
171
172
_SubscriptionStatusChanged.Broadcast(value);
172
173
_SubscriptionStatusChangedBP.Broadcast(value);
173
174
} ;
175
+
174
176
{ {- range .Interface.Properties } }
175
177
on{ {Camel .Name} }Changed = [this]({ {ueParam " In" . } })
176
178
{
@@ -203,6 +205,7 @@ void {{$Class}}::Deinitialize()
203
205
{ {- range .Interface.Properties} }
204
206
on{ {Camel .Name} }Changed = on{ {Camel .Name} }ChangedEmpty;
205
207
{ {- end} }
208
+
206
209
g{ {$Class } }Handle = nullptr;
207
210
Super::Deinitialize();
208
211
}
@@ -265,8 +268,58 @@ void {{$Class}}::Set{{Camel .Name}}({{ueParam "In" .}})
265
268
{ {- range .Interface.Operations} }
266
269
{ {ueReturn " " .Return } } { {$Class } }::{ {Camel .Name} }({ {ueParams " In" .Params} })
267
270
{
271
+ if (! b_isReady)
272
+ {
273
+ UE_LOG(Log{{$Iface } }Client_JNI, Error, TEXT("No valid connection to service. Check that android service is set up correctly"));
274
+ return { {ueDefault " " .Return } };
275
+ }
268
276
TPromise<{ {ueReturn " " .Return} }> Promise;
269
- // TODO call on java side
277
+
278
+ #if PLATFORM_ANDROID && USE_ANDROID_JNI
279
+ UE_LOG(Log{ {$Iface } }Client_JNI, Warning, TEXT("{ {$javaClassPath } }/{ {$javaClassName } }:{ {.Name} } "));
280
+ if (m_javaJniClientClass == nullptr)
281
+ {
282
+ {{- $signatureParams := jniJavaSignatureParams .Params} }
283
+ UE_LOG(Log{ {$Iface } }Client_JNI, Warning, TEXT("{ {$javaClassPath } }/{ {$javaClassName } }:{ {camel .Name} }Async:(Ljava/lang/String;{ {$signatureParams } })V CLASS not found"));
284
+ return { {ueDefault " " .Return } };
285
+ }
286
+ JNIEnv* Env = FAndroidApplication::GetJavaEnv();
287
+ static jmethodID MethodID = Env->GetMethodID(m_javaJniClientClass, "{ {camel .Name} }Async", "(Ljava/lang/String;{ {$signatureParams } })V");
288
+ if (MethodID != nullptr)
289
+ {
290
+ auto id = g{{$Class } }methodHelper.StorePromise(Promise);
291
+ auto idString = FJavaHelper::ToJavaString(Env, id.ToString(EGuidFormats::Digits));
292
+
293
+ { {- range .Params -} }
294
+ { {template " convert_to_java_type_in_param" .} }
295
+ { {- end } };
296
+
297
+ FJavaWrapper::CallVoidMethod(Env, m_javaJniClientInstance, MethodID, *idString, { {- range $idx , $p := .Params -} } { {- if $idx } }, { { end -} }
298
+ { {- $javaPropName := Camel .Name} }
299
+ { {- $cppropName := ueVar " In" .} }
300
+ { {- $localName := printf " jlocal_%s" $javaPropName } }
301
+ { {- if .IsArray } } { {$localName } }
302
+ { {- else if or ( or (eq .KindType " enum" ) (eq .KindType " string" ) ) (not .IsPrimitive ) } } { {$localName } }
303
+ { {- else } } { {$cppropName } }
304
+ { {- end -} }
305
+ { {- end -} });
306
+
307
+ { {- range $idx , $p := .Params -} }
308
+ { {- $javaPropName := Camel .Name} }
309
+ { {- $localName := printf " jlocal_%s" $javaPropName } }
310
+ { {- if or ( or .IsArray (eq .KindType " enum" ) ) (eq .KindType " string" )} }
311
+ Env->DeleteLocalRef({ {$localName } });
312
+ { {- else if not ( or (eq .KindType " extern" ) (ueIsStdSimpleType .) ) } }
313
+ Env->DeleteLocalRef({ {$localName } });
314
+ { {- end } }
315
+ { {- end } }
316
+ }
317
+ else
318
+ {
319
+ UE_LOG(Log{{$Iface } }Client_JNI, Warning, TEXT("{ {$javaClassPath } }/{ {$javaClassName } }:{ {camel .Name} }Async (Ljava/lang/String;{ {$signatureParams } })V not found"));
320
+ }
321
+ #endif
322
+ //TODO probalby #elsif set some default on promise as a result.
270
323
return Promise.GetFuture().Get();
271
324
272
325
}
@@ -313,6 +366,7 @@ bool {{$Class}}::_bindToService(FString servicePackage, FString connectionId){
313
366
#endif
314
367
return false;
315
368
}
369
+
316
370
void { {$Class } }::_unbind()
317
371
{
318
372
@@ -408,7 +462,43 @@ JNI_METHOD void {{$jniFullFuncPrefix}}_nativeOn{{Camel .Name}}(JNIEnv* Env, jcla
408
462
409
463
JNI_METHOD void { {$jniFullFuncPrefix } }_nativeOn{ {Camel .Name} }Result(JNIEnv* Env, jclass Clazz, { {jniToReturnType .Return } } result, jstring callId)
410
464
{
411
- // TODO resolve proper promise
465
+ UE_LOG(Log{{$Iface } }Client_JNI, Warning, TEXT("{ {$jniFullFuncPrefix } }_nativeOn{ {Camel .Name} }Result"));
466
+ FString callIdString = FJavaHelper::FStringFromParam(Env, callId);
467
+ FGuid guid;
468
+
469
+
470
+ { {- $javaClassConverter := printf " %sJavaConverter" ( Camel .Return.Schema.Import ) } }
471
+ { {- $hasLocalVar := 1 } }
472
+ { {- if (eq $javaClassConverter " JavaConverter" )} }{ {- $javaClassConverter = printf " %sJavaConverter" $ModuleName } }{ { end } }
473
+ { {- if .Return.IsArray } }
474
+ { {ueReturn " " .} } cpp_result = { { ueDefault " " .Return } };
475
+ { {- if (eq .Return.KindType " string" )} }
476
+ cpp_result = FJavaHelper::ObjectArrayToFStringTArray(Env, result);
477
+ { {- else if .Return.IsPrimitive } }
478
+ jobjectArray localArray = (jobjectArray)result;
479
+ jsize len = Env->GetArrayLength(localArray);
480
+ cpp_result.Reserve(len);
481
+ Env->Get{ {jniToEnvNameType .Return} }ArrayRegion(result, 0, len, cpp_result.GetData());
482
+ Env->DeleteLocalRef(localArray);
483
+ { {- else if not (eq .Return.KindType " extern" )} }
484
+ { {$javaClassConverter } }::fill{ {Camel .Return.Type } }Array(Env, result, cpp_result);
485
+ { {- end } }
486
+ { {- else if eq .Return.KindType " enum" } }
487
+ { {ueReturn " " .Return} } cpp_result = { {$javaClassConverter } }::get{ {Camel .Return.Type } }Value(Env, result);
488
+ { {- else if (eq .Return.KindType " string" )} }
489
+ FString cpp_result = FJavaHelper::FStringFromParam(Env, result);
490
+ { {- else if not (ueIsStdSimpleType .Return )} }
491
+ { {ueReturn " " .Return} } cpp_result = { { ueDefault " " .Return } };
492
+ { {$javaClassConverter } }::fill{ {Camel .Return.Type } }(Env, result,cpp_result);
493
+ { {- else } }
494
+ { {- $hasLocalVar = 0 } }
495
+ { {- end } }
496
+
497
+ FGuid::Parse(callIdString, guid);
498
+ AsyncTask(ENamedThreads::GameThread, [guid, { {if $hasLocalVar } }cpp_{ {end} }result]()
499
+ {
500
+ g{{$Class } }methodHelper.FulfillPromise(guid, { {if $hasLocalVar } }cpp_{ {end} }result);
501
+ });
412
502
}
413
503
414
504
{ {- end } }
0 commit comments