Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
76988fe
feat(jni): add jni module and service adapter stub
dorotaphanSiili Aug 20, 2025
7b895d2
feat(jni): add necessary android files
dorotaphanSiili Aug 18, 2025
7975f7b
feat(jni): extend the config to use java code
dorotaphanSiili Aug 20, 2025
bbf942a
feat(jni): add the jni backend java module
dorotaphanSiili Aug 20, 2025
f02533f
feat(jni): add starting android service
dorotaphanSiili Aug 18, 2025
0363c83
feat(jni): add java data types converter
dorotaphanSiili Aug 21, 2025
2e1b0c2
feat(jni): service notifies jni that it is ready
dorotaphanSiili Aug 19, 2025
6fc0cb9
feat(jni): service exposed for jni implementation
dorotaphanSiili Aug 19, 2025
107f685
feat(jni): include all data types for service
dorotaphanSiili Aug 19, 2025
6b56207
feat(jni): handle native get property
dorotaphanSiili Aug 19, 2025
3744383
feat(jni): service handles ue property changed
dorotaphanSiili Aug 19, 2025
1ffb92b
feat(jni): service handles on signal
dorotaphanSiili Aug 19, 2025
a045431
feat(jni): service handles native set property
dorotaphanSiili Aug 19, 2025
9064a79
feat(jni): service handles methods
dorotaphanSiili Aug 19, 2025
630fdd5
fix: fix for enum arrays for tests
dorotaphanSiili Jul 24, 2025
0f264c8
feat(jni): add jni client
dorotaphanSiili Aug 19, 2025
e9a2c87
feat(jni): use java side client for binding
dorotaphanSiili Aug 19, 2025
215868b
feat(jni): client implement native is ready
dorotaphanSiili Aug 19, 2025
fd698f1
feat(jni): client handles property changed request
dorotaphanSiili Aug 19, 2025
6010277
feat(jni): client handles native properties change
dorotaphanSiili Aug 19, 2025
a7e322f
feat(jni): client handles signals
dorotaphanSiili Aug 20, 2025
c85bc8a
feat(jni): client helpers for execute methods
dorotaphanSiili Aug 20, 2025
2276807
feat(jni): client handles methods
dorotaphanSiili Aug 20, 2025
010f2d6
feat(jni): add a jni readme
dorotaphanSiili Aug 22, 2025
4b73faa
fix(jni): adapter handles string data types
dorotaphanSiili Sep 4, 2025
41d0c67
feat(jni): adapter handles bool types
dorotaphanSiili Sep 4, 2025
9e3cb37
fix(jni): client handle strings data
dorotaphanSiili Sep 4, 2025
42b49ae
feat(jni): client handle boolean data
dorotaphanSiili Sep 4, 2025
427c3b2
fix(jni): converter handles string types
dorotaphanSiili Sep 4, 2025
7ed3edb
feat(jni): converter handles bool types
dorotaphanSiili Sep 4, 2025
49bde10
fix(jni): fix adapter strings data handling
dorotaphanSiili Sep 16, 2025
b40e4d5
fix(jni): change logs severity
dorotaphanSiili Sep 16, 2025
530f1bc
feat(jni): add non android tests
dorotaphanSiili Sep 16, 2025
83b4593
fix(jni): start java service for many modules
dorotaphanSiili Sep 25, 2025
bb4adc5
fix(jni): fix connection status for many modules
dorotaphanSiili Sep 25, 2025
301ca1d
fix(jni): fix client void method
dorotaphanSiili Sep 25, 2025
225ede6
fix(jni): fix upl module names
dorotaphanSiili Sep 25, 2025
50cec8a
fix(jni): tests
dorotaphanSiili Sep 25, 2025
9900a99
fix(jni): handle arrays for long types
dorotaphanSiili Sep 25, 2025
d4bd3f3
fix(jni): improve client safety on destroy
dorotaphanSiili Sep 26, 2025
214590a
fix(jni): fix tests
dorotaphanSiili Sep 30, 2025
2a50a1d
fix(jni): fix converting simple type arrays
dorotaphanSiili Sep 30, 2025
cac8b48
feat(jni): improve passing args to async task
dorotaphanSiili Sep 30, 2025
99f8407
fix(jni): fix starting service for ue5.6
dorotaphanSiili Oct 2, 2025
9ad4ee6
refactor(jni): align to removal plugin folder
dorotaphanSiili Oct 21, 2025
aa071a8
refactor(jni): align to use publisher
dorotaphanSiili Oct 21, 2025
7ac0598
refactor(jni): move java generated code
dorotaphanSiili Oct 21, 2025
28e89f9
feat(jni): add imports, externs, ref ifs
dorotaphanSiili Oct 21, 2025
84609bb
fix(jni): fix for boolean array type
dorotaphanSiili Oct 21, 2025
1360d46
fix(jni): for externs
dorotaphanSiili Oct 21, 2025
7ee4430
fix(jni): fix for converting interfaces
dorotaphanSiili Oct 28, 2025
041cf57
fix(jni): block crashing ref interfaces
dorotaphanSiili Oct 29, 2025
2917505
fix(jni): update goldenmaster
dorotaphanSiili Oct 29, 2025
08eefe3
chore: update the test-apis
dorotaphanSiili Oct 30, 2025
1dce3ac
style(jni): align to clang format
dorotaphanSiili Nov 7, 2025
2f480e3
chore(jni): remove async task for notification
dorotaphanSiili Nov 12, 2025
e6a0be3
fix(jni): script build fix
dorotaphanSiili Nov 17, 2025
9591602
chore(jni): remove checking jni IF signal params
dorotaphanSiili Nov 17, 2025
dff2593
build(jni): android folder is not yet generated
dorotaphanSiili Nov 17, 2025
bbc72e9
fix(jni): handle jclass resources in converter
dorotaphanSiili Dec 18, 2025
6d9b278
chore(jni): check for jni error for jclasses
dorotaphanSiili Dec 18, 2025
cb43a12
chore(jni): manage jni resources converter
dorotaphanSiili Dec 18, 2025
792008c
fix(jni): manage jni resources in jni wrappers
dorotaphanSiili Dec 18, 2025
cc1be53
fix(jni): clean up string local ref
dorotaphanSiili Dec 19, 2025
59cad96
fix(jni): make adapter java jni calls thread safe
dorotaphanSiili Dec 31, 2025
06c5319
fix(jni): improve client jni calls thread safety
dorotaphanSiili Jan 5, 2026
a7ae973
fix(jni): fix prefix for signal parameters
alwa-siili Jan 7, 2026
bb274bd
feat(jni): handle service lifecycle notifications
dorotaphanSiili Jan 19, 2026
ee9d96a
fix(jni): register jni module conditionally
alwa-siili Feb 12, 2026
16c1631
fix(jni): remove stale test handle
alwa-siili Feb 12, 2026
d265db9
fix(jni): guard getting backend service
alwa-siili Feb 12, 2026
2ea4f59
fix(jni): make client / adapter cache thread safe
alwa-siili Feb 12, 2026
79920e6
fix(jni): prevent enum local reference leak
alwa-siili Feb 12, 2026
9312e05
fix(jni): cast directly to int
alwa-siili Feb 12, 2026
d41ca83
fix(jni): use thread safe cache in data converter
alwa-siili Feb 13, 2026
ace9aa4
fix(jni): prevent early return in adapter deinit
alwa-siili Feb 13, 2026
e790124
fix(jni): prevent using uninitialised cache
alwa-siili Feb 13, 2026
1e5286c
fix(jni): prevent using uninitialized jni service
alwa-siili Feb 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .conform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ policies:
- "docs"
- "cli"
- "deps"
- "jni"
descriptionLength: 72
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ The template offers the following feature switches which can be enabled during c
* `monitor`: create a thin decorator class which can be used to log traffic going through API layer
* `olink`: create the adaption layer for the [OLink](https://docs.apigear.io/docs/protocols/objectlink/intro) protocol. This can be used to connect to the simulation or other technologies like python, pure c++ etc..
* `msgbus`: create the adaption layer for the [UE MsgBus](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Messaging) protocol. This can be used for communication inside the same UE app or between different instances, including across network interfaces.
* `jni`: create the jni adaption layer for the android messenger communication provided by apigear java template. Please read more on a separate document readme_jni.
2 changes: 1 addition & 1 deletion apigear/test-apis
5 changes: 5 additions & 0 deletions goldenmaster/Plugins/Counter/Counter.uplugin
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@
"Type": "Runtime",
"LoadingPhase": "default"
},
{
"Name": "CounterJni",
"Type": "Runtime",
"LoadingPhase": "default"
},
{
"Name" : "CounterEditor",
"Type" : "Editor",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ limitations under the License.
#include "Misc/AutomationTest.h"

#if WITH_DEV_AUTOMATION_TESTS

#endif // WITH_DEV_AUTOMATION_TESTS
78 changes: 78 additions & 0 deletions goldenmaster/Plugins/Counter/Source/CounterJni/CounterJni.Build.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using UnrealBuildTool;
using System.IO;

public class CounterJni : ModuleRules
{
public CounterJni(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
#if UE_5_2_OR_LATER
IWYUSupport = IWYUSupport.Full;
#else
bEnforceIWYU = true;
#endif

// Disable nlohmann::json exception handling
PublicDefinitions.Add("JSON_NOEXCEPTION=1");

PublicIncludePaths.AddRange(
new string[] {
// ... add public include paths required here ...
}
);


PrivateIncludePaths.AddRange(
new string[] {
// ... add other private include paths required here ...
}
);


PublicDependencyModuleNames.AddRange(
new string[]
{
"CounterAPI",
"CounterCore",
"Projects",
"Engine",
"JsonUtilities",
"CustomTypesCore",
"CustomTypesJni",
"ExternTypesCore",
"ExternTypesJni"
}
);


PrivateDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CoreUObject",
"Engine",
"CounterCore",
"CounterImplementation",
"CustomTypesAPI",
"ExternTypesAPI",
}
);

if (Target.Platform == UnrealTargetPlatform.Android)
{
PrivateDefinitions.Add("WITH_JNI=1");
string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);
AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(PluginPath, "Counter_JNI_UPL.xml"));

PrivateDependencyModuleNames.AddRange(new string[] { "Launch" });
}


DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
124 changes: 124 additions & 0 deletions goldenmaster/Plugins/Counter/Source/CounterJni/Counter_JNI_UPL.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>

<root xmlns:android="http://schemas.android.com/apk/res/android">
<trace enable="true"/>
<init>
<log text="android counter init"/>
</init>

<androidManifestUpdates>
<addPermission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<addPermission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<addPermission android:name="counter.counter_android_service.PERMISSION_BIND"/>
<addElements tag="queries">
<package android:name="counter.counter_android_service" />
</addElements>

<addElements tag="application"><service
android:name="counter.counter_android_service.CounterServiceAdapter"
android:enabled="true"
android:exported="true">
</service>
</addElements>

</androidManifestUpdates>

<resourceCopies>
<copyDir src="$S(PluginDir)/buildsystem" dst="$S(BuildDir)/gradle/buildsystem" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counter_android_service" dst="$S(BuildDir)/JavaLibs/counter_android_service" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counter_android_client" dst="$S(BuildDir)/JavaLibs/counter_android_client" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counter_api" dst="$S(BuildDir)/JavaLibs/counter_api" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counter_android_messenger" dst="$S(BuildDir)/JavaLibs/counter_android_messenger" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counter_impl" dst="$S(BuildDir)/JavaLibs/counter_impl" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counterjniservice" dst="$S(BuildDir)/src/counterjniservice" />
<copyDir src="$S(PluginDir)/../../../../android/counter/counterjniclient" dst="$S(BuildDir)/src/counterjniclient" />
</resourceCopies>

<baseBuildGradleAdditions>
<addElements tag="buildscript">
<insertValue value="apply from: 'buildsystem/config.gradle'"/>
<insertValue value="apply from: 'buildsystem/dependencies.gradle'"/>
<insertNewline/>
</addElements>
</baseBuildGradleAdditions>

<settingsGradleAdditions>
<insert>
<![CDATA[
include ':counter_api'
include ':counter_impl'
include ':counter_android_service'
include ':counter_android_client'
include ':counter_android_messenger'
]]>
</insert>

</settingsGradleAdditions>

<buildGradleAdditions>
<insert>
<![CDATA[
dependencies {
implementation project(':counter_api')
implementation project(':counter_impl')
implementation project(':counter_android_service')
implementation project(':counter_android_client')
implementation project(':counter_android_messenger')
}
]]>
</insert>
<insert>
<![CDATA[
tasks.configureEach { task ->
if (task.name == 'assembleDebug') {
task.dependsOn ':counter_api:assembleDebug'
task.dependsOn ':counter_impl:assembleDebug'
task.dependsOn ':counter_android_service:assembleDebug'
task.dependsOn ':counter_android_client:assembleDebug'
task.dependsOn ':counter_android_messenger:assembleDebug'
}
if (task.name == 'assembleRelease') {
task.dependsOn ':counter_api:assembleRelease'
task.dependsOn ':counter_impl:assembleRelease'
task.dependsOn ':counter_android_service:assembleRelease'
task.dependsOn ':counter_android_client:assembleRelease'
task.dependsOn ':counter_android_messenger:assembleRelease'
}
}

]]>
</insert>
</buildGradleAdditions>


<proguardAdditions>
<insert>
-keep class counter.counterjniservice.CounterJniService {
public *;
}
-keep class counter.counterjniservice.CounterJniServiceStarter {
public *;
}
-keep class counter.counterjniclient.CounterJniClient {
public *;
}
</insert>
</proguardAdditions>



<!-- optional additions to the GameActivity class in GameActivity.java -->
<gameActivityClassAdditions>
</gameActivityClassAdditions>


<!-- optional additions to GameActivity onCreate in GameActivity.java -->
<gameActivityOnCreateAdditions>
<insert>
<![CDATA[
]]>
</insert>
</gameActivityOnCreateAdditions>


</root>
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
Copyright 2021 ApiGear UG
Copyright 2021 Epic Games, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "Counter/CounterJni.h"
#include "Counter/Generated/CounterFactory.h"
#include "Counter/Generated/Jni/CounterDataJavaConverter.h"
#include "Engine/Engine.h"
#include "CounterSettings.h"
#include "Modules/ModuleManager.h"

#define LOCTEXT_NAMESPACE "CounterJni"

void FCounterJniModule::StartupModule()
{
}

void FCounterJniModule::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
#if PLATFORM_ANDROID && USE_ANDROID_JNI
CounterDataJavaConverter::cleanJavaReferences();
#endif
}

IMPLEMENT_MODULE(FCounterJniModule, CounterJni)

#undef LOCTEXT_NAMESPACE
Loading
Loading