我有一个已经在JavaSE上工作的自定义字符集。
我的CharsetProvider的类在文件java.nio.charset.spi.CharsetProvider
中指定,该文件位于META-INF/services
中,所有内容都正常加载并按预期工作。
但是现在我在android上也使用了lib,但是在Android-App中没有加载charset。
如何整合我的字符集,以便在Android-App中按预期使用?
Charset.forName("MyCS");
目前我正在做一个像这样的解决方法:
public static String decode(String encoding, byte[] buffer, int offset, int length) {
String result = "";
try {
result = new String(buffer, offset, length, encoding);
} catch (UnsupportedEncodingException ex) {
MyCharsetProvider provider = new MyCharsetProvider();
Charset cs = provider.charsetForName(encoding);
if (cs == null) {
Logger.getLogger(Converters.class.getName()).log(
Level.SEVERE,null,ex);
result = new String(buffer, offset, length);
} else {
result = cs.decode(ByteBuffer.wrap(buffer, offset, length)).toString();
}
}
return result;
}
哪个有效,但对我来说似乎无效,因为每次我尝试使用自己的字符集进行解码时,都会抛出异常并创建一个CharsetProvider-Object。
单身模式可以减少课程的创建。但问题是要避免完全直接使用MyCharsetProvider。
编辑:
由于apk中缺少META-INF/services/java.nio.charset.spi.CharsetProvider
,我可能会将proguard删除。然后我在proguard.cfg中尝试了以下选项:
-adaptresourcefilenames **.CharsetProvider
-adaptresourcefilecontents **.CharsetProvider
但问题仍然存在。那么如何使用ant(netbeans)自动将这些文件从META-INF/services
导入到我的apk中?
答案 0 :(得分:3)
<强> ANT 强>
我现在正在使用以下解决方案:
我创建了一个带有followin目标的custom_rules.xml,用于将META-INF / services中的文件复制到未对齐和未签名的apk中。
<target name="-post-package" depends="-custom-copy" />
<target name="-copy-custom">
<zip destfile="${out.packaged.file}"
update="true"
basedir="${source.absolute.dir}"
includes="${custom.copy}" />
</target>
在ant.properties中我添加了一行
custom.copy=META-INF/services/**
现在我只需要将相关文件从库中复制到我自己项目的META-INF / services文件夹中,以将它们包含在apk中。这使我可以完全控制ServiceLoader要加载哪些类。
<强> 注: 强> 目前我只以这种方式加载外部Java-SE-jar中包含的实现。如果实现在android项目中,则可能必须配置模糊处理。
<强> ECLIPSE-PLUGIN 强>
使用eclipse-plugin,没有像ANT那样的解决方法。问题是ExportHelper(第405行),它只会META-INF
个文件夹中的所有内容。
<强> Android的工作室/摇篮强>
根据这个Bug,您可以在主项目中定义一个META-INF
目录,这将被打包到您的apk中。 META-INF
- 库的文件夹被排除在外,因此您必须指定要在自己的项目中使用的实现(我认为这是它的意图)。