我的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 ()进行静态引用”。我不知道我应该如何解决这个错误。有人有什么想法吗?
发布于 2014-02-05 05:04:14
您需要一个对Context
的引用,而不能在静态初始值设定项块中使用它,因为它不接受参数。最好的办法是在onCreate
中自己的Application
子类中加载库。
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);
}
}
然后将应用程序的名称添加到清单中。例如:
...
<application
android:name="com.example.CustomApplication"
...
如果这不起作用,您将需要一些构造来允许传入引用,同时确保库只加载一次。例如。
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
中使用它。
https://stackoverflow.com/questions/21562968
复制相似问题