【问题标题】:Using static resources inside a jar library (to be used in Android)在 jar 库中使用静态资源(在 Android 中使用)
【发布时间】:2017-11-07 22:53:07
【问题描述】:

我正在开发一个普通的 java 库 (jar),其中包含一些静态文件,我将它们放入 src/main/resources。这些静态文件用于执行算法并将处理后的数据返回给用户。

public String getStringFromFile(String fileName) {
    String text = "";

    try {
        ClassLoader classLoader = getClass().getClassLoader();
        File file = new File(classLoader.getResource(fileName).getFile());
        Scanner scanner = new Scanner(file);

        text = scanner.useDelimiter("\\A").next();
        scanner.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return text;
}

到目前为止一切顺利。但是,当我尝试在 Android 项目中使用这个库/方法时,我得到:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String java.net.URL.getFile()”

我希望我的静态资源文件与库一起发布。难道我做错了什么?有什么想法吗?

【问题讨论】:

  • classLoader.getResource(fileName).getFile() 没用。它应该返回给您与fileName 相同的值,并且不会指向您可以使用的任何内容。您可以尝试getResourceAsStream() 看看它是否有效,但这种 JAR 资源很少在 Android 上使用(如果有的话)。
  • @CommonsWare getResourceAsStream() 也不起作用 - 它返回 null。这真的很令人失望,因为我不想仅仅因为 android 在类路径上找不到静态文件就创建 *.aar :(
  • 我试图反编译生成的apk,我试图加载的文件就在那里。奇怪的是,Android把它放到了根目录下的unknown文件夹中..

标签: java android jar resources classpath


【解决方案1】:

好的。我想我已经解决了这个问题。在此article 之后,我在我的 jar 模块的根目录中创建了一个res 目录(与src 目录处于同一级别)并将我的文件放在那里(helloworld.json)。然后将此添加到build.gradle

jar {
  into('resourcez') {
    from 'res'
  }
}

使用这个帮助函数(在 jar 库中)和getResourceAsStream() 我得到了我的资源文件的内容:

public String getModelFromStream(String fileName) {
    final String classpath = "resourcez/";
    ClassLoader classLoader = DexiModelLoader.class.getClassLoader();
    InputStream resourceAsStream = classLoader.getResourceAsStream(fileName);

    if (resourceAsStream == null)
        resourceAsStream = classLoader.getResourceAsStream(classpath + fileName);

    if (resourceAsStream == null)
        return "error";

    Scanner s = new Scanner(resourceAsStream).useDelimiter("\\A");
    return s.hasNext() ? s.next() : "";
}

在此之后,我只需在我的 Android 应用程序中调用 getStringFromStream("helloworld.json")getStringFromStream("resourcez/helloworld.json") 即可!

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多