LINUX.ORG.RU

[C++][Java] пара вопросов по JNI в целом и Android NDK в частности

 ,


0

1

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

вопрос второй: можно ли в нативном коде объявить абстрактный класс, который Java-код через JNI воспринимал бы как интерфейс (и, соответственно, позволял бы множественное наследование)? насколько я могу судить, SWIG такого не позволяет - можно ли это сделать вручную?

оба вопроса касаются Android NDK, но если специфика отсутствует - подойдёт ответ и для JNI в общем. язык нативного кода - C++

★★★★★
Ответ на: комментарий от andreyu

Так с NDK идут простенькие примеры.

в которых нет ни первого, ни второго

jtootf ★★★★★
() автор топика

в чем особенная необходимость второго? (и где тут будет множественное наследование)

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

спасибо!

про наследование не совсем понял вопрос

хочу в нативном коде определить некоторый абстрактный класс IObject, и некоторую функцию f(IObject *). хочу иметь возможность в Java-коде написать реализацию этого класса как интерфейса (implements, а не extends) и передать её в функцию f

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

в чем особенная необходимость второго? (и где тут будет множественное наследование)

необходимости пока нет, но хотелось бы иметь представление о потенциальной возможности. вариант использования - объявление в нативном коде интерфейса к камере или сенсорам, который будет использоваться (реализовываться) клиентским кодом на Android-, Blackberry- и iOS-устройстве

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

как-то оно не кажется архитектурно правильным
прямее должно быть определить общий интерфейс в с++, реализации интерфейса для всех платформ тоже на с++, а реализации уже будут общаться с апи конкретной платформы, в случае андроида - через jni и ява-класс-посредник, например

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

я где-то так вопрос и понял, но на сколько я знаю такое сделать нельзя.
по первому: если будут более конкретные вопросы постараюсь подсказать

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

реализации интерфейса для всех платформ тоже на с++

в нативный код выносится только общая для всех платформ часть (плюс минимум glue code вроде JNI-врапперов)

реализации уже будут общаться с апи конкретной платформы

вот этот оверхед надо как-то оправдать. работать с сенсорами в Android, например, куда как проще из Java

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

> хочу иметь возможность в Java-коде написать реализацию этого класса как интерфейса (implements, а не extends) и передать её в функцию f

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

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

в нативный код выносится только общая для всех платформ часть (плюс минимум glue code вроде JNI-врапперов)

Гы! А в TIевском андроиде все наоборот - в жаве общая часть, а на плюсах системнозависимая )

ЗЫ: НВ решил андроидом заняться?

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

ЗЫ: НВ решил андроидом заняться?

я уже не работаю на HB. надоело

jtootf ★★★★★
() автор топика

Дергал джаву из C (Pure C). Могу кинуть примерчик.

GreenFenix
()

почитате pro android games от Vladimir Silva, там есть хорошие примеры по NDK

thevery ★★★★
()

JNI — это голимый «плоский» C. Никакого трупного C++. Так что придётся делать обёртки из кода C вокруг кода C++.

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