Как создать нативную библиотеку C++ на Android?
Мне нужно написать динамическую библиотеку ссылок на C++, которая используется Java на Android. Как я понимаю, это должна быть библиотека.so, но я не знаю, как это сделать. Я попробовал Cygwin, но он вылетает:
$ gcc 1.cpp
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: не удается найти -luser32 collect2: ld вернул 1 состояние выхода
1.cpp:
int main(int, char**)
{
return 0;
}
Кто-нибудь может мне помочь с этим?
PS Я не очень хорош в *nix, так что лучше под Windows
UPD: я установил Android NDK и Cygwin и добавил их в переменную окружения PATH
UPD2: Спасибо за помощь. Проблема была с самим Cygwin. Переустановка и NDK решили проблему.
3 ответа
Для вашего примера используйте g ++ вместо gcc, это программа на C++.
Посмотрите на образец hello-jni в NDK. Вам нужно собрать свою общую библиотеку, используя NDK, и импортировать ее в проект Java Android. В коде Java вам нужно объявить нативные функции с помощью "native" и добавить библиотеку с использованием static; смотрите фрагмент ниже.
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
Вероятно, вам понадобится Android NDK для компиляции и связывания собственных библиотек на Android. Cygwin и Windows должны работать (Cygwin предоставляет необходимые инструменты *nix).
Мне кажется, что вы скомпилировали исходный код C++ для среды WINTEL, которая полностью отличается от телефонов Android. Так что, если вы загрузите эту библиотеку в телефон, она, безусловно, вылетит / не будет работать вообще.
Вот статья, которая может помочь. Он охватывает часть android-ndk/cygwin и должен содержать несколько указателей на дополнительную информацию.
РЕДАКТИРОВАТЬ
вздохнул часть сообщения об ошибке в Google и был удивлен, что нет никаких результатов с user32 lib ... тогда я понял, что часть -luser32
эффективно убрал все user32
связанные ссылки из списка результатов;)
Это самая многообещающая ссылка: http://www.cygwin.com/ml/cygwin/2003-01/msg00292.html
По сути - запустите установку cygwin и добавьте пакет, содержащий библиотеку user32. Тогда это должно работать.
Посмотрите на образцы, которые идут с NDK. Вам необходимо использовать привязки JNI, чтобы позволить ему взаимодействовать с Java. Под этими привязками вы можете делать все что угодно, но все, что должно быть доступно из Java, должно проходить через привязки JNI. Все, что НЕ ДОЛЖНО быть доступным, может быть написано так, как вы это обычно делаете.
И да, это прекрасно выполнимо под окнами.