Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> java + exe(c++), как состыковать потоки? 
:(
    Опции темы
Fieral
Дата 7.9.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Мне нужно передать из Java в exe: массив размера H*W и потом (после обработки) обратно.

У меня есть исходник на с++ этого ехе-шника, который можно слека "подкрутить".

Я сделал в яве запуск exe которому в качестве параметров запуска передаю H и W, а затем в exe читаю по очереди числа массива:
Код

     for (int i=0; i<H; i++) { for (int j=0; j<W; j++) {
                  std::cin>>matrix[i][j];
                   } }


В яве я беру инпутстрим процесса и туда аналогично по очереди, через пробел записываю значения массива.

Код

for (int i = 0; i < H; i++) {
                    for (int j = 0; j < W; j++) {
                        
                            bw.write(" " + (int) m[i,j]);

                    }
                    

                }



Как вы догадываетесь, это всё хоть и работает, но очень медленно. Поэтому вопрос: как делать передачу массивов между программами через стримы не через жопу правильно?

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 7.9.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. А каков объем передаваемых данных?
2. Полный передачи код из Java приведи.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Mabramyan
Дата 8.9.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 3.7.2007
Где: Алматы

Репутация: нет
Всего: нет



Если есть исходники попробуй скомпилировать как dll библиотеку и подключить ее из java (смотри jni)
PM MAIL WWW   Вверх
Fieral
Дата 8.9.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Про объём данных: я передаю из явы в exe-шник изображение на обработку. (1-3Mb)


мой индийский код: 
Код


public void Execute() {

        I = this.input.GetDATA(this).Clone();

        int H = I.getHeight();
        int W = I.getWidth();

        O.setSize(H, W);
        Runtime r = Runtime.getRuntime();
        Process p1 = null;

        stt = this.par.GetDATA(this);

        this.sigma = Double.parseDouble(stt[0]);
        this.k = Integer.parseInt(stt[1]);
        this.min = Integer.parseInt(stt[2]);

        InputStream is;
        OutputStream os;
        //
        synchronized (l) {
            // int ch=0;
            try {
                p1 = r
                // .exec("K:\\[WORK]\\---pool\\lib\\SEG.exe "
                        .exec(".\\lib\\SEG.exe " + H + " " + W + " "
                                + this.sigma + " " + this.k + " " + this.min
                                + " 1");

                

                os = p1.getOutputStream();
                is = p1.getInputStream();

                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                        os));
                String tmp = "";
                for (int i = 0; i < H; i++) {
                    for (int j = 0; j < W; j++) {
                        bw.write(" " + (int) I.getVal(i, j));

                    }

                }
                bw.flush();
                bw.close();

                BufferedReader bf = new BufferedReader(
                        new InputStreamReader(is));

                String t = "";
                int mm = 0;
                for (int i = 0; i < H; i++) {
                    for (int j = 0; j < W; j++) {
                        t = bf.readLine();

                        O.setVal(i, j, (int) Double.parseDouble(t));

                    }

                }

                is.close();

            } catch (Exception e) {
                e.printStackTrace();
            }

            p1.destroy();

        }

        this.output.PushDATA(O, this);
    }


--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 8.9.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну явных косяков я не вижу, есть некоторое непонимание вызванное неполнотой кода. Что возвращает this.input.GetDATA(this)? Можно ли переделать сам exe-шник?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
serger
Дата 9.9.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 1
Всего: 5



Может потестить сам механизм? И пошаманить с буферами?


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Fieral
Дата 9.9.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



this.input.GetDATA(this) - возвращает входной массив размера H*W числел из диапазона 0-255 (0 - чёрный, 255 - белый, остальные - оттенки серого)

проблема в том что на заливку массива 320*280 вот этим методом:
Код

 for (int i = 0; i < H; i++) {
                    for (int j = 0; j < W; j++) {
                        bw.write(" " + (int) I.getVal(i, j));

                    }

                }


уходит около минуты

поэтому меня интересует как вливать сразу весь массив "в один шаг" в екзешник? при том что у меня есть возможность править с++ код.
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
kosmonaFFFt
Дата 9.9.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Хм...
А если просто залить данные во временный файл и считать, после чего удалить?
Можно попробовать заюзать отображаемые на память файлы (http://www.exampledepot.com/egs/java.nio/CreateMemMap.html).


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 9.9.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Думаю для начала стоит перейти с текстового формата на бинарный.


Цитата(kosmonaFFFt @  9.9.2009,  18:28 Найти цитируемый пост)
А если просто залить данные во временный файл и считать, после чего удалить?

Кстати хороший вариант.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Fieral
Дата 9.9.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Цитата(LSD @  9.9.2009,  18:49 Найти цитируемый пост)
Думаю для начала стоит перейти с текстового формата на бинарный.

А можно эту часть поподробнее?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
LSD
Дата 9.9.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Fieral @  9.9.2009,  18:58 Найти цитируемый пост)
А можно эту часть поподробнее? 

А че подробней, у тебя же есть OutputStream вот и пиши туда байты:
Код

  private static final ByteOrder ORDER = ByteOrder.nativeOrder();

  public static void writeInt(OutputStream out, int i) throws IOException
  {
    if(ORDER == ByteOrder.LITTLE_ENDIAN)
    {
      out.write(0xFF & i);
      out.write(0xFF & (i >>> 8));
      out.write(0xFF & (i >>> 16));
      out.write(0xFF & (i >>> 24));
    }else     if(ORDER == ByteOrder.BIG_ENDIAN)
    {
      out.write(0xFF & (i >>> 24));
      out.write(0xFF & (i >>> 16));
      out.write(0xFF & (i >>> 8));
      out.write(0xFF & i);
    }
  }

А в Си читай по 4 байта и приводи к int.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Temdegon
Дата 9.9.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



Мне кажется лучше разобраться с JNI. Нужно запихнуть си-код в функцию, скомпилить dll, подрубить dll из Java и вызывать Cи-функцию из библиотеки как обычный статический Java-метод. В двух словах  описано  ТУТ. В примере все вообще просто, без массивов. Я делал с массивом, и все работало отлично.
PM MAIL   Вверх
Fieral
Дата 10.9.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Цитата(Temdegon @ 9.9.2009,  20:19)
Мне кажется лучше разобраться с JNI. Нужно запихнуть си-код в функцию, скомпилить dll, подрубить dll из Java и вызывать Cи-функцию из библиотеки как обычный статический Java-метод. В двух словах  описано  ТУТ. В примере все вообще просто, без массивов. Я делал с массивом, и все работало отлично.

Щас подробнее покурю эту ссылку. Пока один вопрос: как происходит стыковка java типов с с++ типами?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Temdegon
Дата 10.9.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: 7
Всего: 9



В си подрубается jni.h
Аргументы в си-функцию будут приходить специальных типов: jobject, jdouble, jint и т.п. Фактически, ты с ними будешь работать как с обычными си-типами.
Но тебе с этим особо заморачиваться не нужно. ты просто описываешь java-метод и натравливаешь на него javah.exe. Эта прожка сама сгенерит заголовок твоей си-функции, со всеми преобразованиями типов. 
Там есть некоторые неочевидные моменты с конвертацией строк и с массивами, но я думаю ты разберешься. Инфы в инете по этому делу валом. Вот здесь тоже глянь. Если будешь юзать какой-нить компилятор, типа cl виндовского, то могут возникнуть вопросы с опциями компиляции. Я с этим долго возился.
Для начала сделай простенький пример из FAQ, и 90% вопросов сразу отвалятся. 
PM MAIL   Вверх
alon4ik
Дата 13.9.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.9.2009
Где: Харьков

Репутация: нет
Всего: нет



если есть код на Си, не проще ли было бы переписать алгоритм на джаве? Или он достаточно сложный.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.