如何从用户提供的目录加载库?

时间:2014-02-04 20:42:29

标签: java android static libraries

我的Android应用程序通过调用System.loadLibrary ("midi");加载自行开发的库。它从libmidi.so/system/lib加载/vendor/lib。由于这些是系统库目录,我无法将库放在/vendor/lib中。我根据我的Nexus来测试应用程序,但这显然不是如何部署应用程序的方式。因此,我应该使用loadLibrary而不是使用load,并为其提供例如dataDir ()的路径。 public class MidiDriver implements Runnable { // declarations of variables and methods and at the end: static { // System.loadLibrary ("midi"); String s = Context.getApplicationInfo().dataDir; System.load (s + "midi"); } } 喜欢:

{{1}}

我收到错误“无法对非静态方法getApplicationInfo()进行静态引用”。我不知道应该如何解决这个错误。有人的想法吗?

1 个答案:

答案 0 :(得分:2)

您需要引用静态初始化程序块中不能包含的Context,因为它不接受参数。最好的办法是将库加载到Application中自己的onCreate子类中。

package com.example;
// imports
public class CustomApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        String path = new File(getApplicationInfo().dataDir, "midi").getPath();
        System.loadLibrary(path);
    }
}

然后将应用程序的名称添加到清单中。 e.g。

...
<application
    android:name="com.example.CustomApplication"
    ...

如果这不起作用,您将需要一些允许传入引用的构造,同时确保仅加载一次库。 E.g。

public class Init {
    private static final AtomicBoolean STATE = new AtomicBoolean(false);
    public static void init(Context context) {
        if (STATE.compareAndSet(false, true)) {
            String path = new File(context.getApplicationInfo().dataDir, "midi").getPath();
            System.loadLibrary(path);
        }
    }
}

只会在您第一次拨打Init.init(somecontext)时运行,但我怀疑您是否可以在Runnable内使用它。