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

Java 如何从用户提供的目录加载库?,java,android,static,libraries,Java,Android,Static,Libraries,我的Android应用程序通过调用System.loadLibrary(“midi”)加载一个自行开发的库。它从/system/lib或/vendor/lib加载libmidi.so。由于这些是系统库目录,我无法将库放入/vendor/lib。我将Nexus作为测试应用程序的根,但这显然不是部署应用程序的方式。因此,我不应该使用loadLibrary,而应该使用load并为其提供路径,例如dataDir()如下: public class MidiDriver implements Runnab

我的Android应用程序通过调用
System.loadLibrary(“midi”)加载一个自行开发的库。它从
/system/lib
/vendor/lib
加载
libmidi.so
。由于这些是系统库目录,我无法将库放入
/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");
    }
}

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

您需要对
上下文的引用,因为它不接受参数,所以不能在静态初始值设定项块中引用该上下文。最好是在
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"
    ...

将仅在您第一次调用
Init.Init(somecontext)
时运行,但我怀疑您是否可以在
Runnable

中使用它,谢谢您的详细回答!问题是我无法控制应用程序,因为它是由delphi生成的。如果我可以通过load命令访问应用程序主目录,这将非常有帮助。你不能:)有一些方法,比如将上下文存储在
静态
变量中,然后从那里访问它,但这需要非常仔细的检查,或多或少是一种黑客行为。嗯,似乎我被卡住了。我可以将参数传输到此静态构造吗?
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);
        }
    }
}