summaryrefslogtreecommitdiff
path: root/libnativeloader/public_libraries.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libnativeloader/public_libraries.cpp')
-rw-r--r--libnativeloader/public_libraries.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index d244f375a6..4e292eee68 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -21,6 +21,7 @@
#include <dirent.h>
#include <algorithm>
+#include <map>
#include <memory>
#include <android-base/file.h>
@@ -42,6 +43,7 @@ using android::base::ErrnoError;
using android::base::Result;
using internal::ConfigEntry;
using internal::ParseConfig;
+using internal::ParseJniConfig;
using std::literals::string_literals::operator""s;
namespace {
@@ -49,6 +51,7 @@ namespace {
constexpr const char* kDefaultPublicLibrariesFile = "/etc/public.libraries.txt";
constexpr const char* kExtendedPublicLibrariesFilePrefix = "public.libraries-";
constexpr const char* kExtendedPublicLibrariesFileSuffix = ".txt";
+constexpr const char* kJniConfigFile = "/linkerconfig/jni.config.txt";
constexpr const char* kVendorPublicLibrariesFile = "/vendor/etc/public.libraries.txt";
constexpr const char* kLlndkLibrariesFile = "/apex/com.android.vndk.v{}/etc/llndk.libraries.{}.txt";
constexpr const char* kVndkLibrariesFile = "/apex/com.android.vndk.v{}/etc/vndksp.libraries.{}.txt";
@@ -313,6 +316,21 @@ static std::string InitStatsdPublicLibraries() {
return kStatsdApexPublicLibrary;
}
+static std::map<std::string, std::string> InitApexJniLibraries() {
+ std::string file_content;
+ if (!base::ReadFileToString(kJniConfigFile, &file_content)) {
+ // jni config is optional
+ return {};
+ }
+ auto config = ParseJniConfig(file_content);
+ if (!config.ok()) {
+ LOG_ALWAYS_FATAL("%s: %s", kJniConfigFile, config.error().message().c_str());
+ // not reach here
+ return {};
+ }
+ return *config;
+}
+
} // namespace
const std::string& preloadable_public_libraries() {
@@ -375,6 +393,11 @@ const std::string& vndksp_libraries_vendor() {
return list;
}
+const std::string& apex_jni_libraries(const std::string& apex_ns_name) {
+ static std::map<std::string, std::string> jni_libraries = InitApexJniLibraries();
+ return jni_libraries[apex_ns_name];
+}
+
bool is_product_vndk_version_defined() {
#if defined(__ANDROID__)
return android::sysprop::VndkProperties::product_vndk_version().has_value();
@@ -452,6 +475,24 @@ Result<std::vector<std::string>> ParseConfig(
return sonames;
}
+Result<std::map<std::string, std::string>> ParseJniConfig(const std::string& file_content) {
+ std::map<std::string, std::string> entries;
+ std::vector<std::string> lines = base::Split(file_content, "\n");
+ for (auto& line : lines) {
+ auto trimmed_line = base::Trim(line);
+ if (trimmed_line[0] == '#' || trimmed_line.empty()) {
+ continue;
+ }
+
+ std::vector<std::string> tokens = base::Split(trimmed_line, " ");
+ if (tokens.size() < 2) {
+ return Errorf( "Malformed line \"{}\"", line);
+ }
+ entries[tokens[0]] = tokens[1];
+ }
+ return entries;
+}
+
} // namespace internal
} // namespace android::nativeloader