ndk и Android Studio 1.0

Ответить
yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

ndk и Android Studio 1.0

Сообщение yura91 » 17 апр 2015, 12:04

Можете описать пошаговую инструкцию подключения ndk в Android Studio 1.0 и вызов нативных методов в java коде под андроид( пытаюсь собрать готовые проекты, подключить ndk, но gradle все время выдает ошибки, не могу понять в чем дело)?? Помогите пожалуйста?? Говорят Android Studio 1.0 уже не поддерживает ndk это правда??

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: ndk и Android Studio 1.0

Сообщение Mikhail_dev » 17 апр 2015, 15:20

Говорят Android Studio 1.0 уже не поддерживает ndk это правда??
Говорят Android Studio никогда не поддерживала NDK

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 17 апр 2015, 15:39

Собирать вроде бы можно было:
http://habrahabr.ru/post/228365/
http://habrahabr.ru/company/intel/blog/216353/
Но там старые версии AS. В новой тоже можно, недавно коллега переносил проект из Eclipse, говорит в AS 1.0 поменяли много чего, но проект собрал и он работает. Информацию от него теперь смогу только в понедельник получить.

Вот все, что касается редактирования C/C++ кода, тут ничего не поддерживается. Хотя недавний выход CLion может исправить ситуацию в будущем (хотя вряд ли в ближайшем).

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 20 апр 2015, 16:06

а сейчас уже есть какая то информация на счет подключения ndk??

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 21 апр 2015, 07:51

Как я понял собираются нативная часть сейчас отдельно от AS (в папке в которой находится jni вызвать ndk-build). Далее полученные .so (они будут лежать в папке libs) ложатся в папку \src\main\jniLibs и gradle должен их запихивать в apk автоматически. Для дебажной версии этого должно хватить:
Изображение
Вызывание нативных функций никак не зависит от системы сборки. (можно посмотреть семплы в ndk чтобы понять как это работает, собственно я бы посоветовал вначале собрать под AS что-нибудь из них для пробы)

ну и если есть ошибки, то было бы неплохо узнать что за ошибки.

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 21 апр 2015, 12:27

а как подключить библиотеку opencv к нативной части проекта??

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 22 апр 2015, 07:13

Тут ничем особо не помогу.
первое что предложил гугл: http://stackoverflow.com/questions/2740 ... oid-studio

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 23 апр 2015, 18:37

А как вызывать в java коде класс определенный в jni. Ну хедер его и реализация будут в папке jni написанные на с++ а как дальше создать его обьект в java коде ?? Как обьявить этот класс в java?? Ну метод я знаю обьявляется ключевым словом native а класс как обьявить чтоб можно было создавать его обьекты в java ??

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 24 апр 2015, 07:35

yura91 писал(а):А как вызывать в java коде класс определенный в jni. Ну хедер его и реализация будут в папке jni написанные на с++ а как дальше создать его обьект в java коде ?? Как обьявить этот класс в java?? Ну метод я знаю обьявляется ключевым словом native а класс как обьявить чтоб можно было создавать его обьекты в java ??
Насколько я знаю никак. Взаимодействия из java с jni только через методы. Как вариант написать обертку для с++ класса. Хотя ту зависит от конкретики задачи.
Может вам вообще ненужен это с++ объект в java коде? Может всю работу можно организовать в с/с++, а java возвращать только результат?

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 24 апр 2015, 12:13

а можете написать пример обертки для С++ класса чтоб можно было создавать его обьект в java коде или дать ссылку как это делается??

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 24 апр 2015, 12:37

А вообще судя по всему ссылку на объект можно хранить:
http://stackoverflow.com/questions/1980 ... -c-objects
Но я не уверен что это хорошо и что это работает (я плоховато знаю с++, и не знаю будет ли жить объект созданный new до тех пор пока ему явно не вызвать delete, или он может умереть при каких-то других обстоятельствах и ссылка будет неактуальна). Ну и еще не понятно зачем. Почему бы с++ объект не хранить в нативной части и не работать с ним там. А в Java просто вытягивать нужную информацию с помощью методов?

Как-то так:
[syntax=cpp]
CPP_Object *obj

void
Java_package_name_init(JNIEnv *, jobject) {
obj = new CPP_Object();
}

void
Java_package_name_doSomething(JNIEnv *, jobject) {
// do whatever you want with the object
}

void
Java_package_name_delete(JNIEnv *, jobject) {
delete obj;
}[/syntax]

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 24 апр 2015, 12:57

А в нативной части просто подключаешь хедер класса через include и можно создавать обьект его. Там куда этот хедер подключил верно??

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 24 апр 2015, 13:05

А package_name в приведенном примере что означает?? Это имя package где находится класс Java в котором создается обьект С++ класса?? Ведь класс то сам определяется в jni. А CPP_Object *obj что это??

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 24 апр 2015, 13:55

А в классе Java например MainActivity просто обьявить нативными эти 3 метода и вызывать для создания обьекта??

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: ndk и Android Studio 1.0

Сообщение klblk » 24 апр 2015, 14:54

Думаю вы вообще плохо понимаете что происходит, возможно стоит почитать несколько статей по Android NDK и JNI. Посмотрите семплы и как это все работает. С ходу тут не разберешься. Ну и книжка по с/с++ тоже лишней не будет.
1) в общем случае хедер к классу не относится, но в нем может быть объявлен класс, или два класса, или вообще не быть класса. Но в целом да, скорее всего нужно прописать что-то в include, чтобы что-то использовать.
2) package_name это путь до этой функции в Java. Например если нативная (native) функция stringFromJNI находится в com.example.hellojni.HelloJni.java, то в c++ она примет вид Java_com_example_hellojni_HelloJni_stringFromJNI
3) В примерах используются говорящие названия: CPP_Object *obj - указатель на объект, который мы собираемся использовать, методы init - создание объекта, doSomething - действия над объектом, delete удаление объекта (освобождаем память, в с++ это полезно)

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 24 апр 2015, 15:16

То есть к примеру если я определяю в jni класс MyClass CPP_Object *obj запишется как MyClass* obj и в Java классе MainActivity вызывая 3 указанных метода я смогу создать обьект класса MyClass верно??

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 25 апр 2015, 11:42

все понял

yura91
Сообщения: 265
Зарегистрирован: 22 авг 2014, 13:43

Re: ndk и Android Studio 1.0

Сообщение yura91 » 25 апр 2015, 15:13

NDK_PROJECT_PATH что этот атрибут указывает в build.gradle??

Ответить