首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从用户提供的目录中加载库?

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

Stack Overflow用户
提问于 2014-02-05 04:42:29
回答 1查看 169关注 0票数 0

我的Android应用程序通过调用System.loadLibrary ("midi");加载了一个自研的库。它从/system/lib/vendor/lib加载libmidi.so。因为这些是系统库目录,所以我无法将库放入/vendor/lib。我将我的Nexus作为根来测试应用程序,但这显然不是部署应用程序的方法。因此,我不应该使用loadLibrary,而应该使用load并为其提供路径,例如dataDir (),如下所示:

代码语言:javascript
运行
复制
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 ()进行静态引用”。我不知道我应该如何解决这个错误。有人有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-05 05:04:14

您需要一个对Context的引用,而不能在静态初始值设定项块中使用它,因为它不接受参数。最好的办法是在onCreate中自己的Application子类中加载库。

代码语言:javascript
运行
复制
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);
    }
}

然后将应用程序的名称添加到清单中。例如:

代码语言:javascript
运行
复制
...
<application
    android:name="com.example.CustomApplication"
    ...

如果这不起作用,您将需要一些构造来允许传入引用,同时确保库只加载一次。例如。

代码语言:javascript
运行
复制
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中使用它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21562968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档