2017-06-06 3 views
0

いくつかの静的ファイルを含むプレーンJavaライブラリ(jar)を開発中です。これはsrc/main/resourcesになります。これらの静的ファイルは、アルゴリズムを実行し、処理されたデータをユーザーに返すために使用されます。jarライブラリ内の静的リソースを使用する(Androidで使用する)

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を仮想メソッドを呼び出すための試みを() 'ヌルオブジェクトリファレンスで

静的リソースファイルをライブラリに公開します。私は何か間違っているのですか?何かご意見は?

+0

'classLoader.getResource(fileName).getFile()'は役に立たない。 'fileName'と同じ値を返すべきです。それはあなたが使うことのできるものを指しません。 'getResourceAsStream()'を試しても動作するかどうかは確認できますが、この種のJARリソースはAndroidではほとんど使用されません。 – CommonsWare

+0

@CommonsWare '' getResourceAsStream() ''はどちらもうまくいかず、nullを返します。アンドロイドはクラスパス上で静的ファイルを見つけることができないので、* .aarを作成したくないので、これは本当に残念です。( – maslick

+0

結果のapkをデコンパイルしようとしましたが、ロードしようとしているファイルがあります。それをルートディレクトリの '' unknown''フォルダに置きます。 – maslick

答えて

0

私はこれを解決したと思う。このarticleに続いて、私のjarモジュールのルート(srcディレクトリと同じレベル)にresディレクトリを作成し、そこにファイルを配置しました(helloworld.json)。その後build.gradleにこれを追加しました:

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

私はリソースファイルの内容を取得し、このヘルパー(ジャーLIB内)機能と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() : ""; 
} 

を私は単純にgetStringFromStream("helloworld.json")またはgetStringFromStream("resourcez/helloworld.json")を呼び出します私のアンドロイドアプリとボイラー!

関連する問題