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") {