@@ -38,42 +38,97 @@ set(RN_VERSION_LINK_LIBRARIES
3838
3939# ------- Executorch -------
4040
41+ # libexecutorch.so is the thin JNI wrapper (JNI_OnLoad + ASR entry points).
42+ # It has a hard NEEDED dependency on libqnn_executorch_backend.so, so both must be bundled.
43+ # All other runtime symbols are statically linked from executorch-static/*.a below.
4144add_library (executorch SHARED IMPORTED )
42-
4345set_target_properties (executorch PROPERTIES
4446 IMPORTED_LOCATION "${LIBS_DIR} /executorch/${ANDROID_ABI} /libexecutorch.so" )
4547
4648
47- if (ANDROID_ABI STREQUAL "arm64-v8a" )
48- target_compile_definitions (react-native-executorch PRIVATE ARCH_ARM64 )
49+ set (EXECUTORCH_STATIC_DIR "${LIBS_DIR} /executorch-static/${ANDROID_ABI} " )
50+
51+ # Libs that use static constructors for kernel/backend registration — must use --whole-archive
52+ # so registrations are not stripped by the linker.
53+ set (EXECUTORCH_WHOLE_ARCHIVE_LIBS
54+ "${EXECUTORCH_STATIC_DIR} /liboptimized_native_cpu_ops_lib.a"
55+ "${EXECUTORCH_STATIC_DIR} /libxnnpack_backend.a"
56+ "${EXECUTORCH_STATIC_DIR} /libvulkan_backend.a"
57+ )
4958
50- # ------- pthreadpool -------
51- add_library (pthreadpool SHARED IMPORTED )
59+ # Libs linked normally — only pull in symbols that are referenced.
60+ # Do NOT include libs whose symbols are already compiled by this project
61+ # (e.g. libextension_llm_runner, libextension_llm_sampler, libportable_kernels
62+ # overlap with common/runner/*.cpp).
63+ set (EXECUTORCH_STATIC_LIBS
64+ "${EXECUTORCH_STATIC_DIR} /libexecutorch_core.a"
65+ "${EXECUTORCH_STATIC_DIR} /libexecutorch.a"
66+ "${EXECUTORCH_STATIC_DIR} /libextension_module.a"
67+ "${EXECUTORCH_STATIC_DIR} /libextension_tensor.a"
68+ "${EXECUTORCH_STATIC_DIR} /libextension_threadpool.a"
69+ "${EXECUTORCH_STATIC_DIR} /libextension_data_loader.a"
70+ "${EXECUTORCH_STATIC_DIR} /libextension_runner_util.a"
71+ "${EXECUTORCH_STATIC_DIR} /libtokenizers.a"
72+ "${EXECUTORCH_STATIC_DIR} /libsentencepiece.a"
73+ "${EXECUTORCH_STATIC_DIR} /libportable_kernels.a"
74+ "${EXECUTORCH_STATIC_DIR} /liboptimized_kernels.a"
75+ "${EXECUTORCH_STATIC_DIR} /libXNNPACK.a"
76+ "${EXECUTORCH_STATIC_DIR} /libxnnpack-microkernels-prod.a"
77+ "${EXECUTORCH_STATIC_DIR} /libkleidiai.a"
78+ "${EXECUTORCH_STATIC_DIR} /libre2.a"
79+ "${EXECUTORCH_STATIC_DIR} /libcpublas.a"
80+ "${EXECUTORCH_STATIC_DIR} /libeigen_blas.a"
81+ "${EXECUTORCH_STATIC_DIR} /libpthreadpool.a"
82+ "${EXECUTORCH_STATIC_DIR} /libextension_flat_tensor.a"
83+ "${EXECUTORCH_STATIC_DIR} /libextension_named_data_map.a"
84+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_message.a"
85+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_globals.a"
86+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_log_sink_set.a"
87+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_format.a"
88+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_check_op.a"
89+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_conditions.a"
90+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_nullguard.a"
91+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_internal_proto.a"
92+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_globals.a"
93+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_entry.a"
94+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_sink.a"
95+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_initialize.a"
96+ "${EXECUTORCH_STATIC_DIR} /libabsl_log_flags.a"
97+ "${EXECUTORCH_STATIC_DIR} /libabsl_str_format_internal.a"
98+ "${EXECUTORCH_STATIC_DIR} /libabsl_strings.a"
99+ "${EXECUTORCH_STATIC_DIR} /libabsl_strings_internal.a"
100+ "${EXECUTORCH_STATIC_DIR} /libabsl_base.a"
101+ "${EXECUTORCH_STATIC_DIR} /libabsl_raw_logging_internal.a"
102+ "${EXECUTORCH_STATIC_DIR} /libabsl_spinlock_wait.a"
103+ "${EXECUTORCH_STATIC_DIR} /libabsl_synchronization.a"
104+ "${EXECUTORCH_STATIC_DIR} /libabsl_symbolize.a"
105+ "${EXECUTORCH_STATIC_DIR} /libabsl_stacktrace.a"
106+ "${EXECUTORCH_STATIC_DIR} /libabsl_int128.a"
107+ "${EXECUTORCH_STATIC_DIR} /libabsl_time.a"
108+ "${EXECUTORCH_STATIC_DIR} /libabsl_time_zone.a"
109+ "${EXECUTORCH_STATIC_DIR} /libabsl_throw_delegate.a"
110+ "${EXECUTORCH_STATIC_DIR} /libabsl_status.a"
111+ "${EXECUTORCH_STATIC_DIR} /libabsl_statusor.a"
112+ "${EXECUTORCH_STATIC_DIR} /libabsl_malloc_internal.a"
113+ "${EXECUTORCH_STATIC_DIR} /libabsl_raw_hash_set.a"
114+ "${EXECUTORCH_STATIC_DIR} /libabsl_hash.a"
115+ "${EXECUTORCH_STATIC_DIR} /libabsl_kernel_timeout_internal.a"
116+ "${EXECUTORCH_STATIC_DIR} /libabsl_examine_stack.a"
117+ "${EXECUTORCH_STATIC_DIR} /libabsl_strerror.a"
118+ "${EXECUTORCH_STATIC_DIR} /libabsl_city.a"
119+ "${EXECUTORCH_STATIC_DIR} /libabsl_low_level_hash.a"
120+ )
52121
53- set_target_properties ( pthreadpool PROPERTIES
54- IMPORTED_LOCATION " ${LIBS_DIR} /pthreadpool/ ${ANDROID_ABI} /libpthreadpool.so" )
122+ if (ANDROID_ABI STREQUAL "arm64-v8a" )
123+ target_compile_definitions ( react-native-executorch PRIVATE ARCH_ARM64 )
55124
56125 # ------- cpuinfo -------
57126 add_library (cpuinfo SHARED IMPORTED )
58-
59127 set_target_properties (cpuinfo PROPERTIES
60128 IMPORTED_LOCATION "${LIBS_DIR} /cpuinfo/${ANDROID_ABI} /libcpuinfo.so" )
61129
62- # ------- QNN backend (optional, only linked if present) -------
63- set (QNN_BACKEND_LIB "${LIBS_DIR} /executorch/${ANDROID_ABI} /libqnn_executorch_backend.so" )
64- if (EXISTS "${QNN_BACKEND_LIB} " )
65- add_library (qnn_executorch_backend SHARED IMPORTED )
66- set_target_properties (qnn_executorch_backend PROPERTIES
67- IMPORTED_LOCATION "${QNN_BACKEND_LIB} " )
68- set (QNN_LIBS "qnn_executorch_backend" )
69- else ()
70- set (QNN_LIBS "" )
71- endif ()
72-
73130 set (EXECUTORCH_LIBS
74- "pthreadpool"
75131 "cpuinfo"
76- ${QNN_LIBS}
77132 )
78133endif ()
79134
@@ -116,7 +171,12 @@ target_link_libraries(
116171 ${OPENCV_LIBS}
117172 ${OPENCV_THIRD_PARTY_LIBS}
118173 ${PHONEMIS_LIBS}
174+ -Wl,--whole-archive
175+ ${EXECUTORCH_WHOLE_ARCHIVE_LIBS}
176+ -Wl,--no-whole-archive
177+ ${EXECUTORCH_STATIC_LIBS}
119178 executorch
120179 ${EXECUTORCH_LIBS}
180+ vulkan
121181 z
122182)
0 commit comments