jni加载so文件

/**

 * MobiRpcLoader, so文件加载类

 *

 * @author ddd

 * @date 2024/2/26 19:06

 */

@Slf4j

public final class MobiRpcLoader {

    private static final String NATIVE_MODULE_NAME = "mobirpc";

    private static final String SDK_CONFIG_DIRECTORY = "config";

    private static final String SDK_CONFIG_TEMP_PATH = "/.cache/engine-adapter/mobi/";

    private static final String SDK_MOBI_LOG_LEVEL_NAME = "SDK_MOBI_LOG_LEVEL";

    private MobiRpcLoader() {

    }

    /**

     * 加载so文件

     *

     * @return 接口协议对象

     */

    public static MobiRpc load() {

        try {

            MobiRpc mobiRpc = Native.load(NATIVE_MODULE_NAME, MobiRpc.class);

            String configPath = getConfigPath();

            log.info("module: {}, loading config: {}", NATIVE_MODULE_NAME, configPath);

            mobiRpc.rpcInitEnv(configPath);

            String logLevelStr = System.getenv(SDK_MOBI_LOG_LEVEL_NAME);

            if (CharSequenceUtil.isNotBlank(logLevelStr)) {

                mobiRpc.setLogLevel(Integer.parseInt(logLevelStr));

            }

            return mobiRpc;

        } catch (Throwable e) {

            log.error("load module: {} failed", NATIVE_MODULE_NAME, e);

        }

        return null;

    }

    /**

     * 获取配置文件路径

     * 配置文件,so接口使用,需要文件夹路径

     * 因配置文件打在jar中,需要读取并保存到外部路径中

     *

     */

    private static String getConfigPath() throws IOException {

        URL fileUrl = ClassUtil.getLocation(MobiRpcLoader.class);

        //jarFile

        JarFile jarFile = null;

        if (URLUtil.isJarFileURL(fileUrl)) {

            jarFile = new JarFile(fileUrl.getPath());

        } else if (URLUtil.isJarURL(fileUrl)) {

            jarFile = URLUtil.getJarFile(fileUrl);

        } else {

            //do nothing

        }

        //config

        if (Objects.nonNull(jarFile)) {

            String targetPath = FileUtil.getUserHomePath() + SDK_CONFIG_TEMP_PATH;

            try {

                List<JarEntry> jarEntries = jarFile.stream()

                        .filter(jarEntry -> jarEntry.getName().startsWith(SDK_CONFIG_DIRECTORY))

                        .filter(jarEntry -> !jarEntry.isDirectory())

                        .collect(Collectors.toList());

                for (JarEntry jarEntry : jarEntries) {

                    InputStream input = jarFile.getInputStream(jarEntry);

                    FileUtil.writeFromStream(input, targetPath + jarEntry.getName());

                }

            } finally {

                IoUtil.close(jarFile);

            }

            return targetPath + SDK_CONFIG_DIRECTORY;

        } else {

            return fileUrl.getPath() + SDK_CONFIG_DIRECTORY;

        }

    }

}

发表评论 / Comment

用心评论~