繁体   English   中英

Android KXmlParser "NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V"

[英]Android KXmlParser "NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V"

我在 Spock 规范(无 Robolectric)中使用 KXmlParser 来解析 Android strings.xml 文件。 我间歇性地得到以下跟踪:

java.lang.NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V

    at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1509)
    at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:1001)
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:448)
    at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)

知道有什么问题吗?

这是我的 ext 属性:

minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'

这是代码片段:

        try (FileInputStream in = new FileInputStream("app/src/main/res/values/strings.xml")) {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(in, null);

            AndroidStringResource resource = null;
            int eventType = parser.getEventType();
            while (eventType != parser.END_DOCUMENT) {
                eventType = parser.next();

                if (eventType == parser.START_TAG) {
                    if (parser.getName().equals("string")) {
                        resource = new AndroidStringResource();
                        resource.name = parser.getAttributeValue(null, "name");
                        resource.context = parser.getAttributeValue(null, "context");

                        String maxLengthStr = parser.getAttributeValue(null, "maxLength");
                        resource.maxLength = (maxLengthStr == null) ? -1 : Integer.parseInt(maxLengthStr);
                    }
                } else if (eventType == parser.TEXT) {
                    if (resource != null) {
                        resource.value = parser.getText();
                    }
                } else if (eventType == parser.END_TAG) {
                    if (parser.getName().equals("string")) {

                        if (!resourceNameToServerKeyMap.containsKey(resource.name)) {
                            androidStringResourceMap.put(resource.name, resource);
                        }
                        resource = null;
                    }
                }
            }
        }

请注意,我正在向 strings.xml 中的元素添加自定义 XML 属性。 下面是一个例子:

<resources>
    <string name="app_name" maxLength="30">myapp</string>
</resources>

MVCE 可重现的测试用例在这里是可用的。

问题是由于我使用 Spock 框架在 Android VM 之外的 JVM 中运行测试引起的。 这意味着我的测试无法使用 Android 运行时提供的某些代码。 解决方案是使用 robolectric,以便它可以提供 Android 运行时的影子实现,并且仍然允许我的测试在 Android VM 之外的 JVM 中运行。 一旦我将 spock 测试更改为使用 robolectric,一切都很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM