Есть ли опыт работы с Android NDK?
-
18-09-2019 - |
Вопрос
Меня особенно интересует, насколько он портативен между различными телефонами.У нас есть приложение с тяжелым вычислительным кодом, который мы хотели бы использовать для Android и iPhone.Если бы мы могли написать его на C, у нас была бы единая кодовая база, но если NDK поддерживает только подмножество процессоров, которые создают производители телефонов, или если нам придется перекомпилировать для каждого процессора, это неработоспособное решение. .
Спасибо за любой опыт с ним.
Решение
По поводу того, будут ли все телефоны Android (версия 1.5+) поддерживать вывод текущего NDK:
Все, что я могу сказать, это то, что в документации нет ничего, что указывало бы на иное (если, возможно, вы не прочитали подтекст в "этот выпуск поддерживает набор инструкций ARMv5TE"), и я довольно внимательно слежу за новостями Android и не слышал о выпуске каких-либо телефонов Android с архитектурой, отличной от ARM (хотя некоторые люди собрали сборку для EeePC).Глядя на Источник Android, есть следы только еще одной платформы — x86.Что касается дальнейших планов Google и ОНА?Вам придется спросить их.Недавно они объявили о некоторых дни разработчиков, но, наверное, уже все пятна пропали (первый сегодня).Я зарегистрировался довольно рано на лондонский день (17-го числа), так что, если я приеду, я постараюсь получить ответ там (я тоже хочу знать наверняка).
Другие советы
Я не очень знаком с разработкой iPhone, но если вы посмотрите на страница Android NDK, В разделе «Инструменты разработки» перечислены гарантированные заголовки, доступные на платформе, поэтому, если iphone поддерживает эти функции или вы можете создавать интерфейсы между своим кодом и собственными библиотеками на обеих платформах, то я не понимаю, почему это не так. т работаю.
NDK по сути является реализацией Собственный интерфейс Java для Андроид.Он дает вам GCC 4.2.1 (насколько я могу судить, полный набор инструментов) с целью arm-eabi
.Я не знаю, будет ли полученный код работать на iPhone или других устройствах;Я никогда не программировал для iPhone.Вот что file
должен сказать о чем-то, что я построил с помощью NDK, так что, возможно, вы сможете сравнить:
libpuzzles.so:Общий объект ELF, 32-битный младший значащий разряд, ARM, версия 1 (SYSV), динамически связанный, не удаленный
(strip
Включено;Просто я его здесь не запускал.) Вот gcc -v
или g++ -v
(они идентичны):
Использование встроенных спецификаций.
Цель:рука-эаби
Настроено с:/opt/digit/android/git/android-ndk/out/arm-eabi-4.2.1/toolchain/src/gcc-4.2.1/configure --prefix=/opt/digit/android/git/android-ndk /build/prebuilt/linux-x86/arm-eabi-4.2.1 --target=arm-eabi --host=x86
_
64-неизвестный-linux-gnu --build=x86_
64-unknown-linux-gnu --enable-languages=c,c++ --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 -- отключить-sjlj-Exceptions --disable-shared --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --with-abi=aapcs --disable-nls --prefix=/opt/digit/android/git/android-ndk/build/prebuilt/linux-x86/arm-eabi-4.2.1 --with-sysroot=/opt/digit/android/git/android-ndk /build/platforms/cupcake/arch-arm --program-transform-name=s,^,arm-eabi-,Модель резьбы:одинокий
gcc версия 4.2.1
Если предположить, что код будет работать, управление этим на уровне API — отдельная интересная проблема.Android позволит вам вызывать собственный код только через JNI API.Я не знаком с подходом iPhone, но знаю, что это не Java, поэтому предполагаю, что это больше похоже на стандартное динамическое связывание или dlopen()
?Я имею в виду, что вам придется либо создать свои функции JNI (например, Java_com_example_Foo_YourMethod(JNI_Env*, jobject, ...)
справиться с вызовом из чего-то, что не является JVM (например, код вашего iPhone подделывает JNI_Env?) или, что гораздо менее ужасно, начните с предоставления собственного API, подходящего для iPhone, а затем включите оболочку JNI, которая не является JNI. платформы могут спокойно игнорировать, что, как я понимаю, является распространенным подходом к такого рода вещам.Надеюсь, это поможет.
У меня был хороший опыт написания перекрестного приложения JNI/C с обработкой кадрового буфера в NDK и рендерингом в JAVA.
Питти, это решение только для Android