#android #c #eclipse #java-native-interface #android-ndk
#Android #c #eclipse #java-родной интерфейс #android-ndk
Вопрос:
Привет, ребята! В последнее время я работаю над приложением на c , которое должно быть запущено на Android 2.1 и 2.2. поэтому мне интересно, есть ли у меня готовое приложение на c , могу ли я просто поместить его в файл *.so, а затем создать android project и просто загрузить эту библиотеку с помощью System.LoadLibrary (blalba.so ); сработает ли это?
Ответ №1:
Да, вам придется перекомпилировать все собственные библиотеки специально для Android. Да, вам действительно нужен исходный код для всех сторонних собственных библиотек, которые вы планируете использовать, просто потому, что обычно, когда мы компилируем и связываем эти библиотеки вне Android, они связаны с glibc, но, к сожалению, Android не использует glibc из-за недостатка доступа и проблем с производительностью. Android использует разбавленную версию glibc под названием libc. Он имеет имена символов, соответствующие glibc для большинства обычных функций. Но, насколько я знаю, libc не обладает какой-либо функциональностью, связанной со строками, и у него определенно нет какой-либо поддержки posix. Если ваши собственные библиотеки используют какую-либо из устаревших функций, вам придется найти обходной путь для них, используя альтернативную функциональность, поддерживаемую libc, и соответствующим образом кодируя свои библиотеки.
Кроме того, как вы правильно указали, вам придется использовать NDK для интерфейса Java (Android app / fwk) с native world (C ).
Хотя это звучит довольно просто, по моему опыту, компиляция собственных библиотек на Android (перенос на Android) традиционно занимала очень много времени без гарантии успеха.
Комментарии:
1. Большое спасибо за комментарий, это действительно полезно. Кстати, есть ли какие-то особенности в кодировании для Android, особенно для 2.1 и 2.2, или это может быть просто обычный код на C и Java?
2. @user747228: Android имеет трехуровневую архитектуру, где самый нижний уровень является собственным (C / C ), поверх него находится слой Jni (называемый App Fwk), а приложения на основе Java размещаются поверх App Fwk. Код C, C привязывается к Android libc, поэтому он должен быть совместим с ним (подробности того, что я помню, отличаются, приведены в ответе). Что касается App Fwk и App, они используют функциональность, предоставляемую Android SDK, которая является более или менее базовой java, но Android отказывается говорить, что это Java.
3. @user747228: Если вы найдете ответ и комментарий полезными, не забудьте пометить их как принятый ответ 🙂
4. Чтобы добавить к вышесказанному, вам также придется скомпилировать для каждой платформы, которую вы хотите поддерживать, упаковать все файлы .so и загрузить соответствующий файл во время выполнения. Это не было проблемой, когда Android был по существу доступен только для ARM. Однако в наши дни в дикой природе существуют устройства на базе Intel (и, возможно, другие).