在我的android项目中,我在'/apps/libs'文件夹下添加了一个名为myexternalapp.jar的jar文件。
myexternalapp.jar以以下方式提供资源
/someDir
/jsonfile1.json
/jsonfile2.json
fileresourcesutils.java是myexternalapp.jar的一部分,读取这些json文件如下:
public List<Path> getPathsFromResourceJAR(String folder){
// get path of the current running JAR
String jarPath = getClass().getProtectionDomain()
.getCodeSource()
.getLocation()
.toURI()
.getPath();
System.out.println("JAR Path :" + jarPath);
// file walks JAR
URI uri = URI.create("jar:file:" + jarPath);
try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) {
result = Files.walk(fs.getPath(folder))
.filter(Files::isRegularFile)
.collect(Collectors.toList());
}
return result;
}
但上面代码的问题是,当我从android应用程序调用函数时,如下所示:
`public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FileResourcesUtils util = new FileResourcesUtils();
util.getPathsFromResourceJAR("someDir");
}
}`
然后我得到这个空点错误,因为根据这篇文章,protectiondomain是不允许的:
java.lang.nullpointerexception:尝试对空对象引用调用虚拟方法“java.security.codesource java.security.protectiondomain.getcodesource()”
我把代码改成如下:
public List<Path> getPathsFromResourceJAR(String folder){
URL url = FileResourcesUtils.class.getResource(FileResourcesUtils.class.getSimpleName() + ".class");
System.out.println("URL path : " + url.getPath());
// other code .......
}
但是这里我也得到了空指针错误,因为url对象是空的
当我把上面的代码改为
URL url =FileResourcesUtils.class.getClassLoader().getResource("someDir/jsonfile1.json");
我得到的路径是这样的: jar:file/data.com.testing.<some hash code>!/someDir/jsonfile1.json
但它没有给出jar的位置。
请建议如何获取外部jar下的资源列表。这在非android java应用程序中运行良好。
暂无答案!
目前还没有任何答案,快来回答吧!