Java 如何从用户提供的目录加载库?
我的Android应用程序通过调用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
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);
}
}
}