Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

NDK C vs C++ и примеры - Программирование Android

11.03.2014, 00:43. Просмотров 1960. Ответов 17
Метки нет (Все метки)

Гуру NDK! Посоветуйте!

В очередной раз взялся за NDK и вдруг получилось...
Успешно запустил все примеры что были под руками...

Но... половина примеров на С, половина на С++ с упоминанием С. Что правильнее использовать?
Я сишные языки знаю лишь поверхностно, но ОЧЕНЬ хочется поглубже.

Когда учил яву накачал больше 300 примеров и их изучил... Но где взять столько по си? Нашел штук 20, причем 15 из них по опенгел. Накидайте ссылок на учебники, примеры и опенсорсы!

Для начала интересует:
1) Передача реакции из библиотеки в яву (например каждые 30 секунд по таймеру)
2) работа с файлами побайтно.
3) Передача в виде параметров классы, таблицы или наборы параметров
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2014, 00:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос NDK C vs C++ и примеры (Программирование Android):

AS и Ndk - Программирование Android
Здравствуйте На официальном сайте в разделе ndk почему- то описывается eclipse Предполагается что с AS по аналогии и типа сами...

Android NDK - Программирование Android
Здравствуйте, форумчане. Появилось пара вопросов относительно Android NDK... С NDK можно программировать только вставками нативного...

Подключить NDK - Программирование Android
(моя 101я попытка начать работать с NDK) Чуть сдвинулся, но не хватает теории... 1) Скачал последний NDK (android-ndk-r9c) 2)...

NDK и SDK - Программирование Android
есть класс на яве который использует массив, который с течением времени увеличивается ( то есть массив динамический) в массиве находятся...

Использование NDK - Программирование Android
Пытаюсь освоить NDK... И как всегда не хватает ЗАДАНИЙ! Не могу придумать где можно использовать (для новичка в с++)... Писать еще один...

SDK or NDK - Программирование Android
я начинающий разработчик, на данный момент не много знаю с++. 1) Что лучше изучать SDK и яву или же NDK, в будущем хочу попробовать себя...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
EVP
322 / 244 / 43
Регистрация: 14.12.2010
Сообщений: 465
11.03.2014, 16:45 #2
Цитата Сообщение от Tester64 Посмотреть сообщение
Но... половина примеров на С, половина на С++ с упоминанием С. Что правильнее использовать?
Я сишные языки знаю лишь поверхностно, но ОЧЕНЬ хочется поглубже.
Когда учил яву накачал больше 300 примеров и их изучил... Но где взять столько по си? Нашел штук 20, причем 15 из них по опенгел. Накидайте ссылок на учебники, примеры и опенсорсы!
"C" нужен только для интерфейса от JVM к нативному коду.
На "C" писать сам нативный код слишком накладно и не нужно, т.к. Java предполагает ООП.
Для нативного кода есть С++. Биндинги можно самому делать или использовать SWIG.

На стороне C++ понадобятся C++11, stl, boost, OpenGL ES. Ну и сторонние движки по надобности.
На мой взгляд, отлаживаться под NDK сложновато(трудоёмко), лучше портировать код из других систем, в которых и проводить отладку.

Смотри пример, там же и книжка.

Успехов!
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
11.03.2014, 18:00  [ТС] #3
Цитата Сообщение от EVP Посмотреть сообщение
лучше портировать код из других систем, в которых и проводить отладку
Не подскажите какие инструменты (среда?) нужны для отладки вне андроида? Желательно под Win. Неужели VC++?

До этого кодил в Делфи. И переводить все "скоростные" и "тяжелые" наработки из делфи в тормознутую яву считаю не разумным. В си - другое дело... Наработки не из области графики - математика, работа со строками, простой скриптовый язык, файловое хранилище своей структуры.

Цитата Сообщение от EVP Посмотреть сообщение
там же и книжка.
Электронную версию не нашел! Покупать еще рано - хочу сначала убедиться что в ближайшие пол года хоть что-то продвинется..
0
EVP
322 / 244 / 43
Регистрация: 14.12.2010
Сообщений: 465
11.03.2014, 18:57 #4
Цитата Сообщение от Tester64 Посмотреть сообщение
Не подскажите какие инструменты (среда?) нужны для отладки вне андроида? Желательно под Win. Неужели VC++?
Под виндовс альтернативы нет.
Для для эмуляции OpenGL ES можно использовать PowerVR SDK или ANGLE.
Цитата Сообщение от Tester64 Посмотреть сообщение
Электронную версию не нашел! Покупать еще рано - хочу сначала убедиться что в ближайшие пол года хоть что-то продвинется..
Пока только на английском встречал электронную версию.
Если эклипс полностью заменят на студию, то книжка немного устареет в плане инструментов
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
11.03.2014, 19:30  [ТС] #5
Цитата Сообщение от EVP Посмотреть сообщение
Пока только на английском встречал электронную версию
На английском вроде давно в коллекции лежит, но не смотрел на нее, т.к. не мог пройти первый этап - скомпилить сишную часть проекта без еклипса (через командную строку)

Цитата Сообщение от EVP Посмотреть сообщение
Под виндовс альтернативы нет.
жаль! уйти от винды еще не готов! Часть проектов осталось в поддержке под Делфи и под 1С77. Да и Тотал-Коммандеру альтернативы пока под никс нет...

Похоже прийдется СИЛЬНО урезать пожелания к С++

...для общего развития скажите (почитаю в инете) какие инструменты под линукс для разработки под с++?
0
EVP
322 / 244 / 43
Регистрация: 14.12.2010
Сообщений: 465
11.03.2014, 20:06 #6
Цитата Сообщение от Tester64 Посмотреть сообщение
жаль! уйти от винды еще не готов!
Хм.. я использовал фразу с двойным отрицанием, т.е. оно эквивалентно утверждению "В Visual Studio можно отлаживать код для порта в андроид"

Линукс мне не нравится для разработки, это крайний случай...там годится тот же эклипс, но студия лучше(привычнее, удобнее).
1
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
12.03.2014, 15:52 #7
1)вызывать нативную функцию которая что-то возвращает в таймере
2)
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <string.h>
#include <jni.h>
#include <stdio.h>
 
/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    FILE* file = fopen("/sdcard/hello.txt","w+");
 
    if (file != NULL)
    {
        fputs("HELLO WORLD!\n", file);
        fflush(file);
        fclose(file);
    }
 
    return (*env)->NewStringUTF(env, "Hello from JNI (with file io)!");
}

3) вроде как обычно только в Сишном коде добавятся еще 2 параметра NIEnv* env, jobject thiz

может поможет мой пример
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.03.2014, 19:04  [ТС] #8
Цитата Сообщение от name? Посмотреть сообщение
1)вызывать нативную функцию которая что-то возвращает в таймере
Это как? Пока этого не понял... Как вызвать функцию забитую в яву из С++?
Нечто вроде интерфейса... Или одной фукнцией указать что вызывать при случае - передать ссылку на ява метод, а другая пусть вызовет ее.
0
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
13.03.2014, 00:07 #9
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class startActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        timer = new Timer();
        timer.schedule(task, 1,100);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        System.out.println("Here we go ...");
        setContentView(tv);
        System.out.println("Done!");
    }
    
    public native String  stringFromJNI();
    public native int  intFromJNI();
    
Timer timer;
 
TimerTask task = new TimerTask() {
    
    @Override
    public void run() {
        Log.v("TASK", stringFromJNI() + " " + String.valueOf(intFromJNI()));
    }
};
    static {
        System.loadLibrary("myjni");
    }    
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string.h>
#include <stdio.h>
#include <jni.h>
#include <android/log.h>
 
#define LOG_TAG "MYJNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
 
static char s_string[] = "Hello!";
static int count = 0;
JNIEXPORT jstring JNICALL Java_com_testsamples_startActivity_stringFromJNI
  (JNIEnv *env, jobject obj)
{
       LOGI("MyJNI is called!");
       return (*env)->NewStringUTF(env, s_string);
}
 
JNIEXPORT jint JNICALL Java_com_testsamples_startActivity_intFromJNI
  (JNIEnv *env, jobject obj)
{
       LOGI("MyJNI is called!");
       return count++;
}
как-то так
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 10:17  [ТС] #10
Цитата Сообщение от name? Посмотреть сообщение
как-то так
Не! Вы не поняли!
Такое я уже понял как делать - вроде самый начальный уровень вызывать функции!
Мне нужно ОБРАТНОЕ! Чтобы из Си вызывались команды ява.
Например я запускаю цикл на 1000 и хочу что-бы каждые 100 в яву отправлялась команда на обновление. Или я бы мог задать РАЗНЫЕ команды вызываемые из Си на одну операцию. Например при нажатии на кнопку отправил параметры в Си и в одном случае Си обновила одно текстовое поле, в другом - другое, а в третьем заставило выйти из программы. Или в Си запустить таймер в отдельном потоке (а не в яве) и каждую секунду вызывать Явовский обработчик.

Добавлено через 8 часов 53 минуты
И еще, подкиньте пожалуйста пример работы с SQLite базой данных из Си (если такое возможно). Передача курсора между явой и си, обработка записей в си, вызов из си своих запросов...
0
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
13.03.2014, 16:56 #11
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class startActivity extends Activity {
    static int count = 0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        System.out.println("Here we go ...");
        setContentView(tv);
        System.out.println("Done!");
        intFromJNI();
    }
 
    public native int  intFromJNI();
    
    
    static void  counter(int _count) {
        Log.v("ACTIVITY", String.valueOf(count));
         count += 1;
        };
    
        
    static {
        System.loadLibrary("myjni");
    }    
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
JNIEXPORT jint JNICALL Java_com_testsamples_startActivity_intFromJNI
  (JNIEnv *env, jobject obj)
{
       LOGI("MyJNI is called!");
       while(1){
         jclass cls = (*env)->GetObjectClass(env, obj);
         jmethodID mid = (*env)->GetStaticMethodID(env, cls, "counter", "(I)V");
         (*env)->CallStaticIntMethod(env, cls, mid, 1);
         sleep(1);
       }
       return count++;
}
по БД без понятия...
1
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 20:15  [ТС] #12
На команде
(*env)->CallStaticIntMethod(env, cls, mid, 1);
вызывает ошибку (тихо умирает программа забыв даже выдать ошибку)! До этого все работает...
0
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
13.03.2014, 21:44 #13
у вас все точно так же? может просто прога висит из-за цикла...
вот на всякий случай мой пример
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
14.03.2014, 14:05  [ТС] #14
Цитата Сообщение от name? Посмотреть сообщение
у вас все точно так же? может просто прога висит из-за цикла...
Внешне так-же. У меня был работающий образец. Я его взял и доделал по Вашему образцу - добавил фукнцию static void counter(int _count), внутрь вставил ТОЛЬКО Log.i что-бы увидеть факт работы. А в мою старую функцию на Си вставил только:
C
1
2
3
4
5
6
jclass cls = (*env)->GetObjectClass(env, obj);
LOGI("MyJNI is called! 1");
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "counter", "(I)V");
LOGI("MyJNI is called! 2");
(*env)->CallStaticIntMethod(env, cls, mid, 1);
LOGI("MyJNI is called! 3");
В логах вижу только
MyJNI is called! 1
MyJNI is called! 2

Добавлено через 6 минут
...криворукий гугл со своим андроидом... Ваш проект успешно открыл на своей студии (последняя версия). И студия тупо скрыла кнопку запуска. Ява код весь в ошибках, как и манифест. На попытку исправить любую ошибку предлагает убрать ошибочную инструкцию... даже android:versionCode="1" красное. Исправить не дает. Единственную ошибку которую сразу заметил - убрал версию СДК из свойств проекта... Но установка не помогла...
Вечером еще раз попробую...
0
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
14.03.2014, 14:10 #15
переходите на eclipse
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 14:10
Привет! Вот еще темы с ответами:

Android NDK - Программирование Android
Здравствуйте. Хотелось бы написать пару программок на андроид, но джаву вообще не знаю. Нагуглил, что можно писать на С++, но толком как...

Чтение файла из ndk - Программирование Android
Пытаюсь прочитать файл с assets/myfolder/test.txt FILE * pFile = fopen (&quot;myfolder/test.txt&quot; , &quot;r&quot; ); if (pFile==NULL) { ...

Защита от взлома с ndk - Программирование Android
код на плюсах тоже декомпилируется в читаемый код?

Сборка приложения, NDK - Программирование Android
По книжке Android NDK:Beginners Guide установил Apache ant, NDK, SDK, Java. Пытаюсь собрать. Делаю всё по книжке: 1) cd...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2014, 14:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru