我的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()进行静态引用”。我不知道应该如何解决这个错误。有人的想法吗?
答案 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
内使用它。