【问题标题】:How to load native lib in android with static{System.loadLibrary()}如何使用 static{System.loadLibrary()} 在 android 中加载本机库
【发布时间】:2013-05-02 09:24:38
【问题描述】:

我在研究android源代码,发现framework中有很多地方使用native code而不使用static{System.loadLibrary()}。

例如,在 SystemServer.java 中,调用了本地方法“init1(args)”,但文件中没有 static{System.loadLibrary()}。如何在没有 static{System.loadLibrary()} 的情况下加载本机代码?谢谢。

【问题讨论】:

    标签: android java-native-interface


    【解决方案1】:

    本机库对于整个应用程序只需加载一次,因此它可能已经被另一个之前已实例化的类加载。请注意,这不是最佳实践,因为它对调用类的顺序进行了假设!

    避免这种情况的常用技术是创建一个Loader 类,如下所示:

    class Loader {
        private static boolean done = false;
    
        protected static synchronized void load() {
            if (done)
                return;
    
            System.loadLibrary("library_name");
    
            done = true;
        }
    }
    

    这样,如果您在每个需要使用本机函数的类上调用 static{Loader.load();},就可以确保该库已加载(并且仅加载一次)。

    【讨论】:

      【解决方案2】:

      对于仍然发现这个的人,您可以简单地使用:

      OpenCVLoader.initDebug()
      

      org.opencv.android.OpenCVLoader
      

      方法文档:

      从当前应用程序包中加载并初始化 OpenCV 库。粗略地说,它类似于 system.loadLibrary("opencv_java")。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        相关资源
        最近更新 更多