Skip to content

Commit 4301233

Browse files
yunhanw-googlerestyled-commits
authored andcommitted
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 <[email protected]>
1 parent 0da756b commit 4301233

File tree

12 files changed

+162
-31
lines changed

12 files changed

+162
-31
lines changed

build/chip/java/config.gni

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Copyright (c) 2022 Project CHIP Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
java_path = getenv("JAVA_PATH")
16+
declare_args() {
17+
java_matter_controller_dependent_paths = []
18+
build_java_matter_controller = false
19+
if (java_path != "") {
20+
java_matter_controller_dependent_paths += [
21+
"${java_path}/include/",
22+
"${java_path}/include/linux/",
23+
]
24+
build_java_matter_controller = true
25+
}
26+
}

build/chip/java/rules.gni

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
# limitations under the License.
1414

1515
import("//build_overrides/chip.gni")
16-
16+
import("${chip_root}/build/chip/java/config.gni")
1717
import("${chip_root}/build/config/android/config.gni")
1818

1919
javac_runner = "${chip_root}/build/chip/java/javac_runner.py"
2020
jar_runner = "${chip_root}/build/chip/java/jar_runner.py"
2121
write_build_config = "${chip_root}/build/chip/java/write_build_config.py"
2222

23-
assert(android_sdk_root != "", "android_sdk_root must be specified")
23+
assert(android_sdk_root != "" || build_java_matter_controller,
24+
"android_sdk_root or java_path must be specified")
2425

2526
# Declare a java library target
2627
#

build/config/compiler/BUILD.gn

+4
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ config("strict_warnings") {
248248
]
249249
}
250250

251+
if (getenv("JAVA_PATH") != "") {
252+
cflags -= [ "-Wshadow" ]
253+
}
254+
251255
cflags_cc = [ "-Wnon-virtual-dtor" ]
252256

253257
ldflags = []

examples/build_overrides/build.gni

-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,4 @@
1515
declare_args() {
1616
# Root directory for build files.
1717
build_root = "//third_party/connectedhomeip/build"
18-
build_java_matter_controller = false
1918
}

examples/java-matter-controller/BUILD.gn

-3
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@
1515
import("//build_overrides/build.gni")
1616
import("//build_overrides/chip.gni")
1717

18-
import("${build_root}/config/android_abi.gni")
1918
import("${chip_root}/build/chip/java/rules.gni")
2019
import("${chip_root}/build/chip/tools.gni")
2120

22-
build_java_matter_controller = true
23-
2421
java_binary("java-matter-controller") {
2522
output_name = "java-matter-controller"
2623
deps = [

scripts/build/build/targets.py

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def BuildHostTarget():
100100
TargetPart('all-clusters-minimal', app=HostApp.ALL_CLUSTERS),
101101
TargetPart('chip-tool', app=HostApp.CHIP_TOOL),
102102
TargetPart('thermostat', app=HostApp.THERMOSTAT),
103+
TargetPart('java-matter-controller', app=HostApp.JAVA_MATTER_CONTROLLER),
103104
TargetPart('minmdns', app=HostApp.MIN_MDNS),
104105
TargetPart('light', app=HostApp.LIGHT),
105106
TargetPart('lock', app=HostApp.LOCK),

scripts/build/builders/host.py

+83
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class HostApp(Enum):
5858
TV_CASTING = auto()
5959
BRIDGE = auto()
6060
DYNAMIC_BRIDGE = auto()
61+
JAVA_MATTER_CONTROLLER = auto()
6162

6263
def ExamplePath(self):
6364
if self == HostApp.ALL_CLUSTERS:
@@ -98,6 +99,8 @@ def ExamplePath(self):
9899
return 'bridge-app/linux'
99100
elif self == HostApp.DYNAMIC_BRIDGE:
100101
return 'dynamic-bridge-app/linux'
102+
elif self == HostApp.JAVA_MATTER_CONTROLLER:
103+
return 'java-matter-controller'
101104
else:
102105
raise Exception('Unknown app type: %r' % self)
103106

@@ -168,6 +171,9 @@ def OutputNames(self):
168171
elif self == HostApp.DYNAMIC_BRIDGE:
169172
yield 'dynamic-chip-bridge-app'
170173
yield 'dynamic-chip-bridge-app.map'
174+
elif self == HostApp.JAVA_MATTER_CONTROLLER:
175+
yield 'java-matter-controller'
176+
yield 'java-matter-controller.map'
171177
else:
172178
raise Exception('Unknown app type: %r' % self)
173179

@@ -357,6 +363,41 @@ def GnBuildArgs(self):
357363
else:
358364
raise Exception('Unknown host board type: %r' % self)
359365

366+
def copyToExampleApp(self, jnilibs_dir, libs_dir, libs, jars):
367+
self._Execute(
368+
["mkdir", "-p", jnilibs_dir], title="Prepare Native libs " + self.identifier
369+
)
370+
371+
for libName in libs:
372+
self._Execute(
373+
[
374+
"cp",
375+
os.path.join(
376+
self.output_dir, "lib", "jni", self.board.AbiName(), libName
377+
),
378+
os.path.join(jnilibs_dir, libName),
379+
]
380+
)
381+
382+
for jarName in jars.keys():
383+
self._Execute(
384+
[
385+
"cp",
386+
os.path.join(self.output_dir, "lib", jars[jarName]),
387+
os.path.join(libs_dir, jarName),
388+
]
389+
)
390+
391+
def createJavaExecutable(self, java_program):
392+
self._Execute(
393+
[
394+
"chmod",
395+
"+x",
396+
"%s/bin/%s" % (self.output_dir, java_program),
397+
],
398+
title="Make Java program executable",
399+
)
400+
360401
def GnBuildEnv(self):
361402
if self.board == HostBoard.ARM64:
362403
self.build_env['PKG_CONFIG_PATH'] = os.path.join(
@@ -370,6 +411,22 @@ def SysRootPath(self, name):
370411

371412
def generate(self):
372413
super(HostBuilder, self).generate()
414+
if 'JAVA_PATH' in os.environ:
415+
self._Execute(
416+
["third_party/java_deps/set_up_java_deps.sh"],
417+
title="Setting up Java deps",
418+
)
419+
420+
exampleName = self.app.ExamplePath()
421+
if exampleName == "java-matter-controller":
422+
self._Execute(
423+
[
424+
"cp",
425+
os.path.join(self.root, "Manifest.txt"),
426+
self.output_dir,
427+
],
428+
title="Copying Manifest.txt to " + self.output_dir,
429+
)
373430

374431
if self.app == HostApp.TESTS and self.use_coverage:
375432
self.coverage_dir = os.path.join(self.output_dir, 'coverage')
@@ -385,6 +442,32 @@ def PreBuildCommand(self):
385442
'--exclude', os.path.join(self.chip_dir, 'third_party/*'),
386443
'--exclude', '/usr/include/*',
387444
'--output-file', os.path.join(self.coverage_dir, 'lcov_base.info')], title="Initial coverage baseline")
445+
if self.app.exampleName == "java-matter-controller" and 'JAVA_PATH' in os.environ:
446+
jnilibs_dir = os.path.join(
447+
self.root,
448+
"examples/",
449+
self.app.ExampleName(),
450+
"app/libs/jniLibs",
451+
self.board.AbiName(),
452+
)
453+
454+
libs_dir = os.path.join(
455+
self.root, "examples/", self.app.ExampleName(), "app/libs"
456+
)
457+
458+
libs = [
459+
"libSetupPayloadParser.so",
460+
"libCHIPController.so",
461+
"libc++_shared.so",
462+
]
463+
464+
jars = {
465+
"CHIPController.jar": "third_party/connectedhomeip/src/controller/java/CHIPController.jar",
466+
"SetupPayloadParser.jar": "third_party/connectedhomeip/src/setup_payload/java/SetupPayloadParser.jar",
467+
}
468+
469+
self.copyToExampleApp(jnilibs_dir, libs_dir, libs, jars)
470+
self.createJavaExecutable("java-matter-controller")
388471

389472
def PostBuildCommand(self):
390473
if self.app == HostApp.TESTS and self.use_coverage:

scripts/build/testdata/all_targets_linux_x64.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ efr32-{brd4161a,brd4187c,brd4163a,brd4164a,brd4166a,brd4170a,brd4186a,brd4187a,b
77
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]
88
genio-lighting-app
99
linux-fake-tests[-mbedtls][-boringssl][-asan][-tsan][-libfuzzer][-coverage][-dmalloc][-clang]
10-
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]
10+
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]
1111
linux-x64-efr32-test-runner[-clang]
1212
imx-{chip-tool,lighting-app,thermostat,all-clusters-app,all-clusters-minimal-app,ota-provider-app}[-release]
1313
infineon-psoc6-{lock,light,all-clusters,all-clusters-minimal}[-ota][-updateimage]

src/controller/data_model/BUILD.gn

+10-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import("//build_overrides/pigweed.gni")
1818

1919
import("$dir_pw_build/python.gni")
2020
import("${chip_root}/build/chip/chip_codegen.gni")
21+
import("${chip_root}/build/chip/java/config.gni")
2122
import("${chip_root}/src/app/chip_data_model.gni")
2223

2324
chip_data_model("data_model") {
@@ -29,7 +30,7 @@ chip_data_model("data_model") {
2930
allow_circular_includes_from = [ "${chip_root}/src/controller" ]
3031
}
3132

32-
if (current_os == "android") {
33+
if (current_os == "android" || build_java_matter_controller) {
3334
chip_codegen("java-jni-generate") {
3435
input = "controller-clusters.matter"
3536
generator = "java"
@@ -170,15 +171,21 @@ if (current_os == "android") {
170171

171172
source_set("java-jni-sources") {
172173
sources = get_target_outputs(":java-jni-generate")
173-
public_configs = [ "${chip_root}/src:includes" ]
174174

175+
public_configs = [ "${chip_root}/src:includes" ]
175176
deps = [
176177
":data_model",
177178
":java-jni-generate",
178179
"${chip_root}/src/inet",
179180
"${chip_root}/src/lib",
180181
"${chip_root}/src/platform",
181-
"${chip_root}/src/platform/android",
182182
]
183+
184+
if (build_java_matter_controller) {
185+
include_dirs = java_matter_controller_dependent_paths
186+
deps += [ "${chip_root}/src/platform/Linux" ]
187+
} else {
188+
deps += [ "${chip_root}/src/platform/android" ]
189+
}
183190
}
184191
}

src/controller/java/BUILD.gn

+18-11
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@
1414

1515
import("//build_overrides/build.gni")
1616
import("//build_overrides/chip.gni")
17-
import("${build_root}/config/android_abi.gni")
17+
import("${chip_root}/build/chip/java/config.gni")
1818
import("${chip_root}/build/chip/java/rules.gni")
1919

20-
if (defined(build_java_matter_controller)) {
21-
build_java_matter_controller = build_java_matter_controller
22-
} else {
23-
build_java_matter_controller = false
20+
if (!build_java_matter_controller) {
21+
import("${build_root}/config/android_abi.gni")
2422
}
2523

2624
shared_library("jni") {
@@ -60,12 +58,24 @@ shared_library("jni") {
6058
"${chip_root}/src/lib",
6159
"${chip_root}/src/lib/support/jsontlv",
6260
"${chip_root}/src/platform",
63-
"${chip_root}/src/platform/android",
6461
]
6562

6663
public_configs = [ "${chip_root}/src:includes" ]
6764

68-
output_dir = "${root_out_dir}/lib/jni/${android_abi}"
65+
if (build_java_matter_controller) {
66+
defines = [ "JAVA_MATTER_CONTROLLER_TEST" ]
67+
include_dirs = java_matter_controller_dependent_paths
68+
69+
deps += [ "${chip_root}/src/platform/Linux" ]
70+
71+
cflags = [ "-Wno-unknown-pragmas" ]
72+
73+
output_dir = "${root_out_dir}/lib/jni"
74+
} else {
75+
deps += [ "${chip_root}/src/platform/android" ]
76+
77+
output_dir = "${root_out_dir}/lib/jni/${android_abi}"
78+
}
6979

7080
ldflags = [ "-Wl,--gc-sections" ]
7181
}
@@ -75,10 +85,7 @@ android_library("java") {
7585

7686
deps = [ "${chip_root}/third_party/java_deps:annotation" ]
7787

78-
data_deps = [
79-
":jni",
80-
"${chip_root}/build/chip/java:shared_cpplib",
81-
]
88+
data_deps = [ ":jni" ]
8289

8390
sources = [
8491
"src/chip/clusterinfo/ClusterCommandCallback.java",

src/lib/support/BUILD.gn

+7-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import("//build_overrides/nlio.gni")
2020
import("//build_overrides/nlunit_test.gni")
2121

2222
import("${chip_root}/build/chip/chip_version.gni")
23+
import("${chip_root}/build/chip/java/config.gni")
2324
import("${chip_root}/build/chip/tests.gni")
2425
import("${chip_root}/src/lib/core/core.gni")
2526

@@ -145,8 +146,12 @@ static_library("support") {
145146
"verhoeff/Verhoeff36.cpp",
146147
]
147148

148-
# added JNI helper on android
149-
if (current_os == "android") {
149+
if (current_os == "android" || build_java_matter_controller) {
150+
if (build_java_matter_controller) {
151+
include_dirs = java_matter_controller_dependent_paths
152+
}
153+
154+
# added JNI helper on android
150155
sources += [
151156
"CHIPJNIError.h",
152157
"JniReferences.cpp",

src/setup_payload/java/BUILD.gn

+9-8
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,28 @@
1414

1515
import("//build_overrides/build.gni")
1616
import("//build_overrides/chip.gni")
17-
18-
import("${build_root}/config/android_abi.gni")
17+
import("${chip_root}/build/chip/java/config.gni")
1918
import("${chip_root}/build/chip/java/rules.gni")
2019

21-
if (defined(build_java_matter_controller)) {
22-
build_java_matter_controller = build_java_matter_controller
23-
} else {
24-
build_java_matter_controller = false
20+
if (!build_java_matter_controller) {
21+
import("${build_root}/config/android_abi.gni")
2522
}
2623

2724
shared_library("jni") {
2825
output_name = "libSetupPayloadParser"
26+
if (build_java_matter_controller) {
27+
include_dirs = java_matter_controller_dependent_paths
28+
output_dir = "${root_out_dir}/lib/jni"
29+
} else {
30+
output_dir = "${root_out_dir}/lib/jni/${android_abi}"
31+
}
2932

3033
sources = [ "SetupPayloadParser-JNI.cpp" ]
3134

3235
deps = [
3336
"${chip_root}/src/lib",
3437
"${chip_root}/src/setup_payload",
3538
]
36-
37-
output_dir = "${root_out_dir}/lib/jni/${android_abi}"
3839
}
3940

4041
android_library("java") {

0 commit comments

Comments
 (0)