Будут ли библиотеки C / C ++ работать на телефоне Android - PullRequest
2 голосов
/ 23 января 2010

У кого-нибудь есть опыт использования JNI для вызова собственных библиотек C / C ++ в Android? Подходит ли среда для работы библиотек C / C ++, и если да, то есть ли что-то конкретное в этой среде, которое вам нужно приспособить? Спасибо

Ответы [ 3 ]

2 голосов
/ 23 января 2010

Насколько я понимаю, Android предоставляет только подмножество стандартной библиотеки времени выполнения C ++. Например, Android не поддерживает исключения в собственном коде. Я думаю, что есть и другие ограничения.

<Ч />

Одна сложность заключается в том, что, хотя сам Android может включать в себя множество встроенных библиотек, только некоторые из них считаются достаточно стабильными для ссылок. На странице Android NDK перечислены безопасные библиотеки.

  • заголовки libc (библиотека C)
  • libm (математическая библиотека) заголовки
  • Заголовки интерфейса JNI
  • заголовки libz (сжатие Zlib)
  • заголовок liblog (Android logging)
  • Минимальный набор заголовков для поддержки C ++

Если ваша библиотека C использует только их, с вами все будет в порядке. Поддержка C ++ звучит немного точнее.

1 голос
/ 07 февраля 2011

Для хорошего примера интеграции C и Java, проверьте это:

https://github.com/jackpal/Android-Terminal-Emulator

Распакуйте файлы, и вы можете найти jni / termExec.cpp - который использует нормальный C API, такой как "exec ()", "fork ()" и "open (/ dev / ptmx)", для реализации эмуляции терминала ( http://linux.die.net/man/4/ptmx).

Просмотрите файл jni / Android.mk, и вы увидите, что cpp скомпилирован как библиотека - libandroidterm.

А затем java-приложение (src / jackpal / androidterm / Exec.java) загрузит библиотеку через System.loadLibrary ("androidterm").

Я думаю, что это приложение предоставляет достаточно маленький пример, чтобы вы могли расширять его любым удобным вам способом - либо cpp, либо java-файлом. (Файл cpp в основном основан на C, а не на C плюс плюс).

И запомните соответствие между ними, например, вот оно:

static JNINativeMethod method_table[]
= {
    { "createSubprocess", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[I)Ljava/io/FileDescriptor;",
        (void*) android_os_Exec_createSubProcess },
    { "setPtyWindowSize", "(Ljava/io/FileDescriptor;IIII)V",
        (void*) android_os_Exec_setPtyWindowSize},
    { "waitFor", "(I)I",
        (void*) android_os_Exec_waitFor},
    { "close", "(Ljava/io/FileDescriptor;)V",
        (void*) android_os_Exec_close} };
0 голосов
/ 24 января 2010

для библиотеки C, у вас не должно быть никаких проблем. библиотека C ++ может быть более интересной, если она использует большую часть стандартной библиотеки, потому что большая часть стандартной библиотеки C ++ отсутствует, но вы всегда можете предоставить свой собственный «mini-STL». это в основном то, как работает external / webkit.

Большая часть java.util.regex, java.nio.charset, java.util и java.text в Android реализуется, например, путем вызова ICU4C. (библиотека находится в external / icu4c, а JNI - в dalvik / libcore / icu / src / main / native.) Используются сочетания интерфейсов CU и C ++ ICU, так что вы можете быть уверены, что этот материал получит довольно хорошую тренировку ежедневно; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...