LINUX.ORG.RU

Android plus C++ plus TCP

 ,


0

3

Можете закидать меня тапками, но мне нужна ваша помощь.

Если я собрался сделать сетевое приложение на Android (возможно даже без графики) то к чему мне стоит готовиться ? К использованию беркли сокетов Linux, или исключительно API из NDK ?

так как я пока сам NDK не видал, и в инете вычитал что доки по нему в Online вообще нету, то пока я скачиваю его, возможно кто то направит меня на путь праведный, на какой нить howto...

если у кого то есть примеры проектов на С++ (без JAVA) для Android, с превеликой радостью приму их для изучения. Так же буду рад просто кускам кода показывающим ужас к которому нужно готовится.

Спасибо.


Почему бы просто не взять poco?

mio ★★ ()

Примеры - скачай NDK, в нем довольно много примеров в самом. В том числе и как подключить libstdc++ итп.

Ждать - полноценное приложение без java вовсе в теории можно с новой NDK сделать, но куда геморнее, и все равно оно будет в рамках JVM работать, если только не запускать параллельно исполняемый файл отдельно. Так что без Java совсем не обойтись.

Ждать отсутствия многих либ, и выкошенного System V IPC (shmget итп).

qrck ★★ ()
Ответ на: комментарий от qrck

Как создать С++ приложение без строчки Java, уже сделал. Просто на сколько я понимаю у ним там своя libstdc++, поэтому может быть урезанная.

А может и тупо будет запрет или не возможность работать на низком уровне напрямую. Хотя навряд ли.

Почему бы просто не взять poco?

Я что могу еще и сторонние фраемворки использовать ?

и все равно оно будет в рамках JVM работать

уху :( тогда зачем вообще эта возможность нужна...

Интересно и как можно вырваться за пределы вирт машины, и работать напрямую с ОС или ядром. Например что бы демон написать.

Cupper ()
Ответ на: комментарий от Cupper

Интересно и как можно вырваться за пределы вирт машины, и работать напрямую с ОС или ядром. Например что бы демон написать.

Вроде бы в 13-ой главе этой книги что-то было.

tlx ★★★★★ ()
Ответ на: комментарий от Cupper

То, что оно будет в рамках jvm работать означает, что сначала будет создана jvm, которая через JNI как то запустит твой нативный код, который да, будет с системой напрямую работать, но это будет все равно из JVM процесса, и по этой причине например, андроид, когда посчитает нужным - посто прибьет молча процесс. Но опять-же, если ты создашь отдельный executable и запустишь его из JVM-ного процесса, то это уже будет процесс отделенный от андроидной java прослойки, независимый демон. Как сделать standalone - в ndk примеры тоже были.

Зы, вспоминил еще: Afaik C++ в NDK имеет не полную поддержку исключений, так что их лучше избегать. Ну и если нужна более менее полноценная libstdc++, точнее говоря, если просто нужна, то тебе нужен минимум андроид 2.3, в более ранних девайсах ее нет.

qrck ★★ ()

Слышал такую байку, что сеть можно использовать только из фоновых процессов, но не из активити.
Кто-то может подтвердить или опровергнуть?

trex6 ★★★★★ ()
Ответ на: комментарий от Cupper

Как создать С++ приложение без строчки Java, уже сделал. Просто на сколько я понимаю у ним там своя libstdc++, поэтому может быть урезанная.

сделать можно, но запустить можно будет только из джавы)
У них своя там bionic, но она вроде все поддреживает что нужно кроме широких чаров

Boy_from_Jungle ★★★★ ()

а вообще если у тиебя все ок с руками можешь буст собрать для андюши, там это у тебя будет больше абстркций

Boy_from_Jungle ★★★★ ()
Ответ на: комментарий от trex6

всё правильно, так и есть. и это правильно, если подумать.

необязательно из фоновых процессов, можно просто поток создать через new Thread(new Runnable()).start(), так тоже будет работать ;)

Важно что работа с сетью должны быть не из главного потока.

BattleCoder ★★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

Т.е. если закладываемся на кроссверсионность - необходимо сразу выносить всю работу с сетью в сервис? А сервисы на с++ можно для андроида писать или только богомерзкая java?

trex6 ★★★★★ ()
Ответ на: комментарий от BattleCoder

Хотелось бы уточнить. Не из главного потока или не из активити а из сервиса? Какое из этих двух утверждений верно?

trex6 ★★★★★ ()
Ответ на: комментарий от qrck

Но опять-же, если ты создашь отдельный executable и запустишь его из JVM-ного процесса, то это уже будет процесс отделенный от андроидной java прослойки, независимый демон

Получается что все таки лучше выносить работу по С++ в отдельный модуль, и стартовать прям из джавы.

Интересно на сколько легко или сложно реализовать полноценную передачу данных между Java (main) и процессом в котором крутится С++. К примеру что бы на джаве по простому склепать гуи, и пересылать данные между С++ частью и Java. Так сказать, полноценное разделение интерфейса и логики.

Грубо говоря приложение разделить на клиент (JAVA) сервер (C++) или это уже пошло ?

Cupper ()
Ответ на: комментарий от Cupper

tcp сокет на localhost из фонового потока - и вуаля ;) По идее должно прокатить. Вопрос целесообразности только, если нужно именно такое разбиение - то пожалуйста, никто не мешает.

qrck ★★ ()
Ответ на: комментарий от trex6

Именно не из главного потока, из любого Thread вроде работает (пару дней назад проверял, мог конечно по невнимательности и ошибиться... я сейчас пускаю программу только в эмуляторе... чаще 2.3, но иногда запускал и под 3 и 4 версиями). Это и удивило... вполне работающая программа под версией 2.3 на версии 4.0 столкнулась с тем, что сеть не работает. :)

Разумеется, этот Thread может создавать любой Activity. Можно и ExecurorsService задействовать. Ещё небось Loader умеет грузить из интернета...

BattleCoder ★★★★★ ()

обычные беркли сокеты. libstdc++ там вообще нет (в NDK от гугла), но есть другие сборки NDK, в которых есть.

waker ★★★★★ ()
Ответ на: комментарий от trex6

Т.е. если закладываемся на кроссверсионность - необходимо сразу выносить всю работу с сетью в сервис? А сервисы на с++ можно для андроида писать или только богомерзкая java?

сервис не обязательно, достаточно обычного потока. создать его можно из нативного кода, там есть pthread. но если через сеть будет что-то долго в фоне качаться, когда гуй приложения скрыт — то да, нужен сервис, иначе андроид будет прибивать процесс. сам сервис придется писать на жабе. но ты не обязан писать сетевой код внутри класса сервиса — ты можешь написать его нативно на C/++ и дергать как из класса сервиса, так и из любого другого. опять же, сервис сам по себе не является потоком, поток нужно самостоятельно создавать. иными словами, все одинаково с сервисом и без него, но при активном сервисе андроид не будет убивать процесс.

waker ★★★★★ ()

если у кого то есть примеры проектов на С++ (без JAVA) для Android, с превеликой радостью приму их для изучения. Так же буду рад просто кускам кода показывающим ужас к которому нужно готовится.

да, решил еще насчет вот этого прокомментировать.. писать под андроид _совсем_ без жабы проблематично. придется весь свой гуй-тулкит с нуля создавать, либо дергать java-классы через JNI, а это гораздо хуже, чем просто писать на жабе.

еще нужно помнить, что nativeactivity доступна только начиная с android2.3.

waker ★★★★★ ()
Ответ на: комментарий от waker

nativeactivity доступна только начиная с android2.3

Это уже учел, пришлось даже отдельный девайс под это дело закупить.

свой гуй-тулкит с нуля создавать

Этим сейчас и занимаюсь. Правда все это делается в рамках написания кросслатформенного игрового «движка» (MeeGo, Android, iOS именно в таком порядке), так что в любом случае пришлось бы весь этот огород с контроллами городить.

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

а, ну если это для игры — то вопросов нет. nativeactivity преимущественно для этого и придумали.

waker ★★★★★ ()

boost::asio работает. Готовиться нужно к полному отсутствию стандартных для платформы нативных фреймворков. Но почти все, что можно собрать под линукс, собирается и на андроиде.

note173 ★★★★★ ()
Ответ на: комментарий от waker

libstdc++ там вообще нет (в NDK от гугла)

Да есть, даже с исключениями и rtti. Можно включить C++0x.

note173 ★★★★★ ()
Ответ на: комментарий от Boy_from_Jungle

значит я пропустил когда это добавили, раньше не было.

waker ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.