проблема с записью вывода: Слишком много методов: 66024; макс. 65536. По пакету: ОШИБКА

У меня очень странная ошибка при использовании apache poi, и я думаю, что это как-то связано с файлом ooxml-schemas--.jar. Я в основном пытаюсь прочитать файл xlsx во внутреннюю память, и этого просто не происходит.

ДЕТАЛИ: я использую Apache Poi 3.9 для чтения из папки res.raw в Android, это файл xlsx, который копирует себя во внутреннюю память в Android, используя Outputstream. И этого просто не происходит. Вот журнал ошибок:

trouble writing output: Too many methods: 66024; max is 65536. By package:
    13 java.lang
     1 java.lang.reflect
     5 java.util
     1 javax.xml.namespace
    66 org.apache.xmlbeans
    19 org.apache.xmlbeans.impl.values
     1 org.apache.xmlbeans.impl.xb.xmlschema
  2500 org.openxmlformats.schemas.drawingml.x2006.chart
  1430 org.openxmlformats.schemas.drawingml.x2006.chart.impl
  8767 org.openxmlformats.schemas.drawingml.x2006.main
  5258 org.openxmlformats.schemas.drawingml.x2006.main.impl
    86 org.openxmlformats.schemas.drawingml.x2006.picture
    33 org.openxmlformats.schemas.drawingml.x2006.picture.impl
   745 org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing
   417 org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.impl
   230 org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing
   164 org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.impl
   298 org.openxmlformats.schemas.officeDocument.x2006.customProperties
   256 org.openxmlformats.schemas.officeDocument.x2006.customProperties.impl
   617 org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes
   596 org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.impl
   285 org.openxmlformats.schemas.officeDocument.x2006.extendedProperties
   196 org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.impl
    23 org.openxmlformats.schemas.officeDocument.x2006.math
    24 org.openxmlformats.schemas.officeDocument.x2006.relationships
     2 org.openxmlformats.schemas.officeDocument.x2006.relationships.impl
  2076 org.openxmlformats.schemas.presentationml.x2006.main
  1224 org.openxmlformats.schemas.presentationml.x2006.main.impl
     1 org.openxmlformats.schemas.schemaLibrary.x2006.main
  7271 org.openxmlformats.schemas.spreadsheetml.x2006.main
  4556 org.openxmlformats.schemas.spreadsheetml.x2006.main.impl
 11448 org.openxmlformats.schemas.wordprocessingml.x2006.main
  9217 org.openxmlformats.schemas.wordprocessingml.x2006.main.impl
     4 schemaorg_apache_xmlbeans.system.sE130CAA0A01A7CDE5A2B4FEB8B311707
  1170 schemasMicrosoftComOfficeExcel
  1223 schemasMicrosoftComOfficeExcel.impl
   285 schemasMicrosoftComOfficeOffice
   124 schemasMicrosoftComOfficeOffice.impl
     2 schemasMicrosoftComOfficePowerpoint
     3 schemasMicrosoftComOfficeWord
  2858 schemasMicrosoftComVml
  2529 schemasMicrosoftComVml.impl
[2013-08-18 14:21:31 - gss4] Conversion to Dalvik format failed with error 2

Что, черт возьми, происходит?

Вот функция, которую я использую:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        readAndWrite();

    }


    public void readAndWrite() {
          try
            {
              // Read from original Excel file. //Get from RawResources in Android
              InputStream inputStream = getResources().openRawResource(R.raw.ems_data);
              OutputStream fos = openFileOutput("ems_data.xlsx", Context.MODE_PRIVATE);
              Workbook workbook = WorkbookFactory.create(inputStream );

              // Get the first sheet.
              Sheet sheet = workbook.getSheetAt(0);

              // Set value of the first cell.
              Row row = sheet.getRow(0);
              Cell cell = row.getCell(0);
              cell.setCellValue("Xuan");

              // Write newly modified workbook to a file. //Copy to Internal Storage in Android
            //  FileOutputStream fileOut = new FileOutputStream("/sdcard/ems_data3new.xlsx");
              workbook.write(fos);
              fos.close();
            }
            catch(FileNotFoundException e)
            {
              System.out.println(e);
            }
            catch(IOException e)
            {
              System.out.println(e);
            }
            catch(InvalidFormatException e)
            {
              System.out.println(e);
            }

      }

person Ahmed Zafar    schedule 18.08.2013    source источник
comment
Я предлагаю вам прочитать другие вопросы о том же сообщении об ошибке.   -  person Dan Hulme    schedule 18.08.2013
comment
У меня есть. Никто из них не говорит о том, как это исправить. И это выступление инженеров Google, просто слишком продвинутый для меня.   -  person Ahmed Zafar    schedule 18.08.2013
comment
Хорошо, я не могу найти ничего, чтобы исправить это ...   -  person Ahmed Zafar    schedule 18.08.2013
comment
@AhmedZafar - Из вывода ясно, что вы НЕ делаете то, что говорите. Вывод явно связан с преобразованием чего-либо в формат Давлика. Пожалуйста, четко и точно изложите, что вы на самом деле делаете и как вы это делаете...   -  person Stephen C    schedule 18.08.2013
comment
@StephenC- я изменил вопрос, чтобы он соответствовал коду, который я использую. Да, я думаю, что преобразование dalvik испортило его, поскольку функция работала в java (хотя, очевидно, она не извлекала файл из необработанного файла или не записывала его во внутреннюю память, она делала это на жестком диске). Я написал, что я делаю, и он возвращает слишком много методов. Я не понимаю, почему вы говорите, что я не говорю, что я делаю!   -  person Ahmed Zafar    schedule 18.08.2013
comment
Я не понимаю, почему вы говорите, что я не говорю, что я делаю! - Потому что вы не сказали, что выполняете преобразование байт-кода в Davlik. Это то, что ты делал... ух! То, что вы сказали нам, это то, что приложение пытается сделать ... что не имеет отношения к проблеме, о которой вы спрашиваете.   -  person Stephen C    schedule 18.08.2013
comment
Не знал, что это имеет значение... Под байт-кодом я предполагаю, что вы имеете в виду что-то вроде java. Вот что я нашел, но мне все еще нужны все банки, которые я использую. Я думаю, что это методы в банках, которые все портят, их слишком много. см. здесь. Как-то обойти это??   -  person Ahmed Zafar    schedule 18.08.2013
comment
@stephenc- Я не выполняю преобразование байт-кода в dalvik, так как я взял функцию и переписал ее в своей основной деятельности! Так что это не актуально. Эта функция должна работать и в Android, но не работает.   -  person Ahmed Zafar    schedule 18.08.2013


Ответы (1)


Ваша проблема вызвана попыткой поместить слишком много кода в приложение для Android. В соответствии с этим Q&A - Android: мое приложение слишком велико и выдает Unable to execute dex: ID метода не в [0, 0xffff]: 65536? - решение состоит в том, чтобы реорганизовать ваше приложение, чтобы часть кода была в виде плагины.

Другой подход — попытаться устранить мертвый код (т. е. библиотечные классы и методы, которые не нужны вашему приложению). Этот вопрос и ответ - Ошибка преобразования Android в формат Dalvik с ошибкой 2? — для этого предлагает использовать Proguard.

person Stephen C    schedule 18.08.2013
comment
Весь мой код сейчас — это всего лишь одна функция. Остальные - это просто файлы jar в папке libs. Что мне с ними делать? - person Ahmed Zafar; 18.08.2013
comment
Прочтите связанные Вопросы. - person Stephen C; 18.08.2013
comment
Спасибо. Я прочитал их, и единственный вывод, который я сделал, это удалить некоторые библиотеки из моих библиотек. Но я не могу этого сделать, так как они мне нужны. Я также не могу "разделить" файлы dex, так как не знаю, как... - person Ahmed Zafar; 18.08.2013
comment
Вы были правы, добрый сэр. Вот хорошее чтение по этому вопросу. Apache может нормально обрабатывать HSSF(xls) на Android, но при обработке XSSF (xlsx) возникает слишком много методов. А жаль. Одна картошка для вас! :) http://mail-archives.apache.org/mod_mbox/poi-dev/201110.mbox/%3CCA+JOeWNWinmNmEtHs5VK+KEc_6BzAG_=LfpdXqsDsnjJKR2X7Q@mail.gmail.com%3E - person Ahmed Zafar; 18.08.2013