mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-02-11 22:32:38 +08:00
This is an early release and there are several things that are known not to work if you're porting your iOS app to Android. See the Known Issues guide on the website. We will work with the community to reach platform parity with iOS.
77 lines
2.2 KiB
Java
77 lines
2.2 KiB
Java
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
package com.facebook.soloader;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
* {@link SoSource} that finds shared libraries in a given directory.
|
|
*/
|
|
public class DirectorySoSource extends SoSource {
|
|
|
|
public static final int RESOLVE_DEPENDENCIES = 1;
|
|
public static final int ON_LD_LIBRARY_PATH = 2;
|
|
|
|
protected final File soDirectory;
|
|
private final int flags;
|
|
|
|
/**
|
|
* Make a new DirectorySoSource. If {@code flags} contains {@code RESOLVE_DEPENDENCIES},
|
|
* recursively load dependencies for shared objects loaded from this directory. (We shouldn't
|
|
* need to resolve dependencies for libraries loaded from system directories: the dynamic linker
|
|
* is smart enough to do it on its own there.)
|
|
*/
|
|
public DirectorySoSource(File soDirectory, int flags) {
|
|
this.soDirectory = soDirectory;
|
|
this.flags = flags;
|
|
}
|
|
|
|
@Override
|
|
public int loadLibrary(String soName, int loadFlags) throws IOException {
|
|
File soFile = new File(soDirectory, soName);
|
|
if (!soFile.exists()) {
|
|
return LOAD_RESULT_NOT_FOUND;
|
|
}
|
|
|
|
if ((loadFlags & LOAD_FLAG_ALLOW_IMPLICIT_PROVISION) != 0 &&
|
|
(flags & ON_LD_LIBRARY_PATH) != 0) {
|
|
return LOAD_RESULT_IMPLICITLY_PROVIDED;
|
|
}
|
|
|
|
if ((flags & RESOLVE_DEPENDENCIES) != 0) {
|
|
String dependencies[] = MinElf.extract_DT_NEEDED(soFile);
|
|
for (int i = 0; i < dependencies.length; ++i) {
|
|
String dependency = dependencies[i];
|
|
if (dependency.startsWith("/")) {
|
|
continue;
|
|
}
|
|
|
|
SoLoader.loadLibraryBySoName(
|
|
dependency,
|
|
(loadFlags | LOAD_FLAG_ALLOW_IMPLICIT_PROVISION));
|
|
}
|
|
}
|
|
|
|
System.load(soFile.getAbsolutePath());
|
|
return LOAD_RESULT_LOADED;
|
|
}
|
|
|
|
@Override
|
|
public File unpackLibrary(String soName) throws IOException {
|
|
File soFile = new File(soDirectory, soName);
|
|
if (soFile.exists()) {
|
|
return soFile;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|