如下图所示,OpenNativeLibrary代码中使用了android_dlopen_ext
打开动态库,本文按照该源码中调用dlopen、dlsym来调用so里的方法,加强一下理解。
继上文梳理了LoadLibrary源码流程,本文就是模仿该流程,在Java层获取到要调用so路径后,传入c层调用dlopen
打开,并通过dlsym
调用方法后dlclose
结束。
void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
jobject class_loader, const char* caller_location, jstring library_path,
bool* needs_native_bridge, char** error_msg) {
#if defined(ART_TARGET_ANDROID)
// 检验命名空间,防止本应用加载别的app的动态库
std::lock_guard<std::mutex> guard(g_namespaces_mutex);
NativeLoaderNamespace* ns;
if ((ns = g_namespaces->FindNamespaceByClassLoader(env, class_loader)) == nullptr) {
Result<NativeLoaderNamespace*> isolated_ns =
CreateClassLoaderNamespaceLocked(env,
target_sdk_version,
class_loader,
/*is_shared=*/false,
/*dex_path=*/nullptr,
library_path,
/*permitted_path=*/nullptr,
/*uses_library_list=*/nullptr);
if (!isolated_ns.ok()) {
*error_msg =