24 #if defined(__ANDROID__)
33 #define THREAD_POOL_SIZE 1
35 static void *dlopen_libbinder_ndk(
void)
44 void *
h = dlopen(
"libbinder_ndk.so", RTLD_NOW | RTLD_LOCAL);
49 "android/binder: unable to load libbinder_ndk.so: '%s'; skipping binder threadpool init (MediaCodec likely won't work)\n",
54 static void android_binder_threadpool_init(
void)
56 typedef int (*set_thread_pool_max_fn)(uint32_t);
57 typedef void (*start_thread_pool_fn)(void);
59 set_thread_pool_max_fn set_thread_pool_max =
NULL;
60 start_thread_pool_fn start_thread_pool =
NULL;
62 void *
h = dlopen_libbinder_ndk();
66 unsigned thead_pool_size = THREAD_POOL_SIZE;
69 (set_thread_pool_max_fn) dlsym(
h,
70 "ABinderProcess_setThreadPoolMaxThreadCount");
72 (start_thread_pool_fn) dlsym(
h,
"ABinderProcess_startThreadPool");
74 if (start_thread_pool ==
NULL) {
76 "android/binder: ABinderProcess_startThreadPool not found; skipping threadpool init (MediaCodec likely won't work)\n");
80 if (set_thread_pool_max !=
NULL) {
81 int ok = set_thread_pool_max(thead_pool_size);
83 "android/binder: ABinderProcess_setThreadPoolMaxThreadCount(%u) => %s\n",
84 thead_pool_size, ok ?
"ok" :
"fail");
87 "android/binder: ABinderProcess_setThreadPoolMaxThreadCount is unavailable; using the library default\n");
92 "android/binder: ABinderProcess_startThreadPool() called\n");
97 #if __ANDROID_API__ >= 24
98 if (android_get_device_api_level() < 35) {
101 "android/binder: API<35, thus no need to initialize a thread pool\n");
104 android_binder_threadpool_init();
110 "android/binder: is built with API<24, assuming this is not Android 15+\n");