Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
1

NDK C vs C++ и примеры

11.03.2014, 00:43. Просмотров 2231. Ответов 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-библиотеку к своему NDK-проекту
Пытаюсь подключить к своему (на самом деле не совсем своему) NDK-проекту...

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

Подключить NDK
(моя 101я попытка начать работать с NDK) Чуть сдвинулся, но не хватает...

Android NDK
Здравствуйте. Хотелось бы написать пару программок на андроид, но джаву вообще...

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

17
EVP
503 / 266 / 59
Регистрация: 14.12.2010
Сообщений: 531
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 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
11.03.2014, 18:00  [ТС] 3
Цитата Сообщение от EVP Посмотреть сообщение
лучше портировать код из других систем, в которых и проводить отладку
Не подскажите какие инструменты (среда?) нужны для отладки вне андроида? Желательно под Win. Неужели VC++?

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

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

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

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

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

Линукс мне не нравится для разработки, это крайний случай...там годится тот же эклипс, но студия лучше(привычнее, удобнее).
1
name?
199 / 170 / 52
Регистрация: 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 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
12.03.2014, 19:04  [ТС] 8
Цитата Сообщение от name? Посмотреть сообщение
1)вызывать нативную функцию которая что-то возвращает в таймере
Это как? Пока этого не понял... Как вызвать функцию забитую в яву из С++?
Нечто вроде интерфейса... Или одной фукнцией указать что вызывать при случае - передать ссылку на ява метод, а другая пусть вызовет ее.
0
name?
199 / 170 / 52
Регистрация: 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 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 10:17  [ТС] 10
Цитата Сообщение от name? Посмотреть сообщение
как-то так
Не! Вы не поняли!
Такое я уже понял как делать - вроде самый начальный уровень вызывать функции!
Мне нужно ОБРАТНОЕ! Чтобы из Си вызывались команды ява.
Например я запускаю цикл на 1000 и хочу что-бы каждые 100 в яву отправлялась команда на обновление. Или я бы мог задать РАЗНЫЕ команды вызываемые из Си на одну операцию. Например при нажатии на кнопку отправил параметры в Си и в одном случае Си обновила одно текстовое поле, в другом - другое, а в третьем заставило выйти из программы. Или в Си запустить таймер в отдельном потоке (а не в яве) и каждую секунду вызывать Явовский обработчик.

Добавлено через 8 часов 53 минуты
И еще, подкиньте пожалуйста пример работы с SQLite базой данных из Си (если такое возможно). Передача курсора между явой и си, обработка записей в си, вызов из си своих запросов...
0
name?
199 / 170 / 52
Регистрация: 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 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
13.03.2014, 20:15  [ТС] 12
На команде
(*env)->CallStaticIntMethod(env, cls, mid, 1);
вызывает ошибку (тихо умирает программа забыв даже выдать ошибку)! До этого все работает...
0
name?
199 / 170 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
13.03.2014, 21:44 13
у вас все точно так же? может просто прога висит из-за цикла...
вот на всякий случай мой пример
0
Tester64
396 / 357 / 46
Регистрация: 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?
199 / 170 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
14.03.2014, 14:10 15
переходите на eclipse
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
14.03.2014, 14:46  [ТС] 16
Цитата Сообщение от name? Посмотреть сообщение
переходите на eclipse
Скорее уж возвращайтесь на екслипс...
Насколько помню... помять требовала от 0,5 в начале до 4х гб, потом зависала. В среднем зависала каждые 4-8 часов. Коомбинации клавиш - жуткие и сильно не сопоставимые с большинством текстовых редакторов. Все проекты обязаны лежать в одной папке (никаких вложеных или вынесеных)... Это из самого запоминающегося. ...и это при том что я уже год как с него слез!
p.s. не уверен что студия виновата! Скорее нашлепки от гугла на Идею.
Короче... как и все линуксовое напоминает танцы с бубнами и никаких стандартов...
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
16.03.2014, 04:13  [ТС] 17
УРА! Получилось! перебрав еще штук 5 примеров получилось запустить вызов реактора явы из С++
C
1
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "counter", "(I)V");
Только не понял что означает здесь это: "(I)V"...
C
1
Встречал "(II)I" "(I)I" "(II)I" "([Ljava/lang/String;)V"... но понятнее не стало
0
name?
199 / 170 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
16.03.2014, 10:08 18
Только не понял что означает здесь это: "(I)V"...
это тип передаваемого параметра в функцию I(Integer), и возврата функции V (Void)

вот нашел хорошую статейку по этой теме
1
16.03.2014, 10:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 10:08

NDK и SDK
есть класс на яве который использует массив, который с течением времени...

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

Использование NDK
Пытаюсь освоить NDK... И как всегда не хватает ЗАДАНИЙ! Не могу придумать где...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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