Add support to compile java matter controller test example in host without android (#23630)

* Add suppoprt to compile java matter controller test in host

* Restyled by gn

Co-authored-by: Restyled.io <commits@restyled.io>
diff --git a/build/chip/java/config.gni b/build/chip/java/config.gni
new file mode 100644
index 0000000..626d7b0
--- /dev/null
+++ b/build/chip/java/config.gni
@@ -0,0 +1,26 @@
+# Copyright (c) 2022 Project CHIP Authors
+#
+# 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.
+
+java_path = getenv("JAVA_PATH")
+declare_args() {
+  java_matter_controller_dependent_paths = []
+  build_java_matter_controller = false
+  if (java_path != "") {
+    java_matter_controller_dependent_paths += [
+      "${java_path}/include/",
+      "${java_path}/include/linux/",
+    ]
+    build_java_matter_controller = true
+  }
+}
diff --git a/build/chip/java/rules.gni b/build/chip/java/rules.gni
index c851830..446bad7 100644
--- a/build/chip/java/rules.gni
+++ b/build/chip/java/rules.gni
@@ -13,14 +13,15 @@
 # limitations under the License.
 
 import("//build_overrides/chip.gni")
-
+import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/build/config/android/config.gni")
 
 javac_runner = "${chip_root}/build/chip/java/javac_runner.py"
 jar_runner = "${chip_root}/build/chip/java/jar_runner.py"
 write_build_config = "${chip_root}/build/chip/java/write_build_config.py"
 
-assert(android_sdk_root != "", "android_sdk_root must be specified")
+assert(android_sdk_root != "" || build_java_matter_controller,
+       "android_sdk_root or java_path must be specified")
 
 # Declare a java library target
 #
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 938d2d7..0704008 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -248,6 +248,10 @@
     ]
   }
 
+  if (getenv("JAVA_PATH") != "") {
+    cflags -= [ "-Wshadow" ]
+  }
+
   cflags_cc = [ "-Wnon-virtual-dtor" ]
 
   ldflags = []
diff --git a/examples/build_overrides/build.gni b/examples/build_overrides/build.gni
index b092dc3..323b150 100644
--- a/examples/build_overrides/build.gni
+++ b/examples/build_overrides/build.gni
@@ -15,5 +15,4 @@
 declare_args() {
   # Root directory for build files.
   build_root = "//third_party/connectedhomeip/build"
-  build_java_matter_controller = false
 }
diff --git a/examples/java-matter-controller/BUILD.gn b/examples/java-matter-controller/BUILD.gn
index 71a44aa..154f75a 100644
--- a/examples/java-matter-controller/BUILD.gn
+++ b/examples/java-matter-controller/BUILD.gn
@@ -15,12 +15,9 @@
 import("//build_overrides/build.gni")
 import("//build_overrides/chip.gni")
 
-import("${build_root}/config/android_abi.gni")
 import("${chip_root}/build/chip/java/rules.gni")
 import("${chip_root}/build/chip/tools.gni")
 
-build_java_matter_controller = true
-
 java_binary("java-matter-controller") {
   output_name = "java-matter-controller"
   deps = [
diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py
index f88e8e7..4c8ed88 100755
--- a/scripts/build/build/targets.py
+++ b/scripts/build/build/targets.py
@@ -100,6 +100,7 @@
         TargetPart('all-clusters-minimal', app=HostApp.ALL_CLUSTERS),
         TargetPart('chip-tool', app=HostApp.CHIP_TOOL),
         TargetPart('thermostat', app=HostApp.THERMOSTAT),
+        TargetPart('java-matter-controller', app=HostApp.JAVA_MATTER_CONTROLLER),
         TargetPart('minmdns', app=HostApp.MIN_MDNS),
         TargetPart('light', app=HostApp.LIGHT),
         TargetPart('lock', app=HostApp.LOCK),
diff --git a/scripts/build/builders/host.py b/scripts/build/builders/host.py
index ce735ad..258be0a 100644
--- a/scripts/build/builders/host.py
+++ b/scripts/build/builders/host.py
@@ -58,6 +58,7 @@
     TV_CASTING = auto()
     BRIDGE = auto()
     DYNAMIC_BRIDGE = auto()
+    JAVA_MATTER_CONTROLLER = auto()
 
     def ExamplePath(self):
         if self == HostApp.ALL_CLUSTERS:
@@ -98,6 +99,8 @@
             return 'bridge-app/linux'
         elif self == HostApp.DYNAMIC_BRIDGE:
             return 'dynamic-bridge-app/linux'
+        elif self == HostApp.JAVA_MATTER_CONTROLLER:
+            return 'java-matter-controller'
         else:
             raise Exception('Unknown app type: %r' % self)
 
@@ -168,6 +171,9 @@
         elif self == HostApp.DYNAMIC_BRIDGE:
             yield 'dynamic-chip-bridge-app'
             yield 'dynamic-chip-bridge-app.map'
+        elif self == HostApp.JAVA_MATTER_CONTROLLER:
+            yield 'java-matter-controller'
+            yield 'java-matter-controller.map'
         else:
             raise Exception('Unknown app type: %r' % self)
 
@@ -357,6 +363,41 @@
         else:
             raise Exception('Unknown host board type: %r' % self)
 
+    def copyToExampleApp(self, jnilibs_dir, libs_dir, libs, jars):
+        self._Execute(
+            ["mkdir", "-p", jnilibs_dir], title="Prepare Native libs " + self.identifier
+        )
+
+        for libName in libs:
+            self._Execute(
+                [
+                    "cp",
+                    os.path.join(
+                        self.output_dir, "lib", "jni", self.board.AbiName(), libName
+                    ),
+                    os.path.join(jnilibs_dir, libName),
+                ]
+            )
+
+        for jarName in jars.keys():
+            self._Execute(
+                [
+                    "cp",
+                    os.path.join(self.output_dir, "lib", jars[jarName]),
+                    os.path.join(libs_dir, jarName),
+                ]
+            )
+
+    def createJavaExecutable(self, java_program):
+        self._Execute(
+            [
+                "chmod",
+                "+x",
+                "%s/bin/%s" % (self.output_dir, java_program),
+            ],
+            title="Make Java program executable",
+        )
+
     def GnBuildEnv(self):
         if self.board == HostBoard.ARM64:
             self.build_env['PKG_CONFIG_PATH'] = os.path.join(
@@ -370,6 +411,22 @@
 
     def generate(self):
         super(HostBuilder, self).generate()
+        if 'JAVA_PATH' in os.environ:
+            self._Execute(
+                ["third_party/java_deps/set_up_java_deps.sh"],
+                title="Setting up Java deps",
+            )
+
+            exampleName = self.app.ExamplePath()
+            if exampleName == "java-matter-controller":
+                self._Execute(
+                    [
+                        "cp",
+                        os.path.join(self.root, "Manifest.txt"),
+                        self.output_dir,
+                    ],
+                    title="Copying Manifest.txt to " + self.output_dir,
+                )
 
         if self.app == HostApp.TESTS and self.use_coverage:
             self.coverage_dir = os.path.join(self.output_dir, 'coverage')
@@ -385,6 +442,32 @@
                            '--exclude', os.path.join(self.chip_dir, 'third_party/*'),
                            '--exclude', '/usr/include/*',
                            '--output-file', os.path.join(self.coverage_dir, 'lcov_base.info')], title="Initial coverage baseline")
+            if self.app.exampleName == "java-matter-controller" and 'JAVA_PATH' in os.environ:
+                jnilibs_dir = os.path.join(
+                    self.root,
+                    "examples/",
+                    self.app.ExampleName(),
+                    "app/libs/jniLibs",
+                    self.board.AbiName(),
+                )
+
+                libs_dir = os.path.join(
+                    self.root, "examples/", self.app.ExampleName(), "app/libs"
+                )
+
+                libs = [
+                    "libSetupPayloadParser.so",
+                    "libCHIPController.so",
+                    "libc++_shared.so",
+                ]
+
+                jars = {
+                    "CHIPController.jar": "third_party/connectedhomeip/src/controller/java/CHIPController.jar",
+                    "SetupPayloadParser.jar": "third_party/connectedhomeip/src/setup_payload/java/SetupPayloadParser.jar",
+                }
+
+                self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
+                self.createJavaExecutable("java-matter-controller")
 
     def PostBuildCommand(self):
         if self.app == HostApp.TESTS and self.use_coverage:
diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt
index de7b361..f893b28 100644
--- a/scripts/build/testdata/all_targets_linux_x64.txt
+++ b/scripts/build/testdata/all_targets_linux_x64.txt
@@ -7,7 +7,7 @@
 esp32-{m5stack,c3devkit,devkitc,qemu}-{all-clusters,all-clusters-minimal,ota-requestor,ota-requestor,shell,light,lock,bridge,temperature-measurement,ota-requestor,tests}[-rpc][-ipv6only]
 genio-lighting-app
 linux-fake-tests[-mbedtls][-boringssl][-asan][-tsan][-libfuzzer][-coverage][-dmalloc][-clang]
-linux-{x64,arm64}-{rpc-console,all-clusters,all-clusters-minimal,chip-tool,thermostat,minmdns,light,lock,shell,ota-provider,ota-requestor,python-bindings,tv-app,tv-casting-app,bridge,dynamic-bridge,tests,chip-cert,address-resolve-tool}[-nodeps][-minmdns-verbose][-libnl][-same-event-loop][-no-interactive][-ipv6only][-no-ble][-no-wifi][-no-thread][-mbedtls][-boringssl][-asan][-tsan][-libfuzzer][-coverage][-dmalloc][-clang][-test][-rpc]
+linux-{x64,arm64}-{rpc-console,all-clusters,all-clusters-minimal,chip-tool,thermostat,java-matter-controller,minmdns,light,lock,shell,ota-provider,ota-requestor,python-bindings,tv-app,tv-casting-app,bridge,dynamic-bridge,tests,chip-cert,address-resolve-tool}[-nodeps][-minmdns-verbose][-libnl][-same-event-loop][-no-interactive][-ipv6only][-no-ble][-no-wifi][-no-thread][-mbedtls][-boringssl][-asan][-tsan][-libfuzzer][-coverage][-dmalloc][-clang][-test][-rpc]
 linux-x64-efr32-test-runner[-clang]
 imx-{chip-tool,lighting-app,thermostat,all-clusters-app,all-clusters-minimal-app,ota-provider-app}[-release]
 infineon-psoc6-{lock,light,all-clusters,all-clusters-minimal}[-ota][-updateimage]
diff --git a/src/controller/data_model/BUILD.gn b/src/controller/data_model/BUILD.gn
index 2596b11..011669d 100644
--- a/src/controller/data_model/BUILD.gn
+++ b/src/controller/data_model/BUILD.gn
@@ -18,6 +18,7 @@
 
 import("$dir_pw_build/python.gni")
 import("${chip_root}/build/chip/chip_codegen.gni")
+import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/src/app/chip_data_model.gni")
 
 chip_data_model("data_model") {
@@ -29,7 +30,7 @@
   allow_circular_includes_from = [ "${chip_root}/src/controller" ]
 }
 
-if (current_os == "android") {
+if (current_os == "android" || build_java_matter_controller) {
   chip_codegen("java-jni-generate") {
     input = "controller-clusters.matter"
     generator = "java"
@@ -170,15 +171,21 @@
 
   source_set("java-jni-sources") {
     sources = get_target_outputs(":java-jni-generate")
-    public_configs = [ "${chip_root}/src:includes" ]
 
+    public_configs = [ "${chip_root}/src:includes" ]
     deps = [
       ":data_model",
       ":java-jni-generate",
       "${chip_root}/src/inet",
       "${chip_root}/src/lib",
       "${chip_root}/src/platform",
-      "${chip_root}/src/platform/android",
     ]
+
+    if (build_java_matter_controller) {
+      include_dirs = java_matter_controller_dependent_paths
+      deps += [ "${chip_root}/src/platform/Linux" ]
+    } else {
+      deps += [ "${chip_root}/src/platform/android" ]
+    }
   }
 }
diff --git a/src/controller/java/BUILD.gn b/src/controller/java/BUILD.gn
index 76cd24c..3a2d404 100644
--- a/src/controller/java/BUILD.gn
+++ b/src/controller/java/BUILD.gn
@@ -14,13 +14,11 @@
 
 import("//build_overrides/build.gni")
 import("//build_overrides/chip.gni")
-import("${build_root}/config/android_abi.gni")
+import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/build/chip/java/rules.gni")
 
-if (defined(build_java_matter_controller)) {
-  build_java_matter_controller = build_java_matter_controller
-} else {
-  build_java_matter_controller = false
+if (!build_java_matter_controller) {
+  import("${build_root}/config/android_abi.gni")
 }
 
 shared_library("jni") {
@@ -60,12 +58,24 @@
     "${chip_root}/src/lib",
     "${chip_root}/src/lib/support/jsontlv",
     "${chip_root}/src/platform",
-    "${chip_root}/src/platform/android",
   ]
 
   public_configs = [ "${chip_root}/src:includes" ]
 
-  output_dir = "${root_out_dir}/lib/jni/${android_abi}"
+  if (build_java_matter_controller) {
+    defines = [ "JAVA_MATTER_CONTROLLER_TEST" ]
+    include_dirs = java_matter_controller_dependent_paths
+
+    deps += [ "${chip_root}/src/platform/Linux" ]
+
+    cflags = [ "-Wno-unknown-pragmas" ]
+
+    output_dir = "${root_out_dir}/lib/jni"
+  } else {
+    deps += [ "${chip_root}/src/platform/android" ]
+
+    output_dir = "${root_out_dir}/lib/jni/${android_abi}"
+  }
 
   ldflags = [ "-Wl,--gc-sections" ]
 }
@@ -75,10 +85,7 @@
 
   deps = [ "${chip_root}/third_party/java_deps:annotation" ]
 
-  data_deps = [
-    ":jni",
-    "${chip_root}/build/chip/java:shared_cpplib",
-  ]
+  data_deps = [ ":jni" ]
 
   sources = [
     "src/chip/clusterinfo/ClusterCommandCallback.java",
diff --git a/src/lib/support/BUILD.gn b/src/lib/support/BUILD.gn
index 3890321..2f86189 100644
--- a/src/lib/support/BUILD.gn
+++ b/src/lib/support/BUILD.gn
@@ -20,6 +20,7 @@
 import("//build_overrides/nlunit_test.gni")
 
 import("${chip_root}/build/chip/chip_version.gni")
+import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/build/chip/tests.gni")
 import("${chip_root}/src/lib/core/core.gni")
 
@@ -145,8 +146,12 @@
     "verhoeff/Verhoeff36.cpp",
   ]
 
-  # added JNI helper on android
-  if (current_os == "android") {
+  if (current_os == "android" || build_java_matter_controller) {
+    if (build_java_matter_controller) {
+      include_dirs = java_matter_controller_dependent_paths
+    }
+
+    # added JNI helper on android
     sources += [
       "CHIPJNIError.h",
       "JniReferences.cpp",
diff --git a/src/setup_payload/java/BUILD.gn b/src/setup_payload/java/BUILD.gn
index df63286..083cd6d 100644
--- a/src/setup_payload/java/BUILD.gn
+++ b/src/setup_payload/java/BUILD.gn
@@ -14,18 +14,21 @@
 
 import("//build_overrides/build.gni")
 import("//build_overrides/chip.gni")
-
-import("${build_root}/config/android_abi.gni")
+import("${chip_root}/build/chip/java/config.gni")
 import("${chip_root}/build/chip/java/rules.gni")
 
-if (defined(build_java_matter_controller)) {
-  build_java_matter_controller = build_java_matter_controller
-} else {
-  build_java_matter_controller = false
+if (!build_java_matter_controller) {
+  import("${build_root}/config/android_abi.gni")
 }
 
 shared_library("jni") {
   output_name = "libSetupPayloadParser"
+  if (build_java_matter_controller) {
+    include_dirs = java_matter_controller_dependent_paths
+    output_dir = "${root_out_dir}/lib/jni"
+  } else {
+    output_dir = "${root_out_dir}/lib/jni/${android_abi}"
+  }
 
   sources = [ "SetupPayloadParser-JNI.cpp" ]
 
@@ -33,8 +36,6 @@
     "${chip_root}/src/lib",
     "${chip_root}/src/setup_payload",
   ]
-
-  output_dir = "${root_out_dir}/lib/jni/${android_abi}"
 }
 
 android_library("java") {