Используйте библиотеку C в Android через NDK

Что я хочу сделать:

Я нашел библиотеку C, которая вычисляет высоту звука аудиопотока, и хочу использовать ее в Android.

Я подумал, что вместо того, чтобы портировать его, я мог бы также использовать его с помощью NDK, верно?

Как это работает? Я должен установить NDK, конечно, и тогда? Могу ли я вызывать функции этой библиотеки C так же, как обычно, в Android?

Библиотека на C, которую я хочу "импортировать":

#include "second_c_file.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>

#ifndef max
#define max(x, y) ((x) > (y)) ? (x) : (y)
#endif
#ifndef min
#define min(x, y) ((x) < (y)) ? (x) : (y)
#endif

int _power2p(int value) {
    ...
}

typedef struct _minmax {
    int index;
    struct _minmax *next;
} minmax;

double _test_calculate(double * var1, int var2, int var3) {
    ...
}

Файл "second_c_file.h" - это еще один файл, который мне, очевидно, нужно импортировать.

Спасибо за вашу помощь!


person caw    schedule 05.12.2011    source источник


Ответы (2)


Хорошим руководством по началу работы с NDK может быть найдено здесь. И да, вы сможете заставить его скомпилировать и вызвать из NDK без особых изменений (при условии, что код не ссылается на другие библиотеки).

person aardvarkk    schedule 05.12.2011
comment
Спасибо за ссылку на этот урок! Установка работает нормально. Но когда дело доходит до интеграции библиотеки C в проект Android (фактическое использование), это не работает. Мое приложение для Android просто показывает сообщение об ошибке, что оно было неожиданно остановлено. Я не знаю, что я сделал не так. Я сделал то, что сказал учебник. И, возможно, вы могли бы взглянуть на мою библиотеку C в вопросе: Какие изменения я должен сделать? (... поскольку имена классов C должны быть чем-то вроде Java_com_your_package_MainActivity_invokeNativeFunction, а в моей библиотеке C еще нет классов...). - person caw; 09.12.2011
comment
Спасибо, учебник, на который вы ссылаетесь, помог мне установить и использовать NDK. - person caw; 16.12.2011

Ознакомьтесь с примерами для начала работы с NDK здесь: http://developer.android.com/sdk/ndk/overview.html#samples

Затем в своем NDK посмотрите на пример two-libs. Вы, вероятно, захотите просто статически связать стороннюю библиотеку обнаружения высоты звука со своим собственным кодом C.

Вам нужно будет просмотреть файл Android.mk и изменить его, чтобы создать стороннюю библиотеку статически, а затем указать, что ваш основной проект использует эту библиотеку.

Это должно быть довольно просто. NDK (давно им не пользовался) немного медвежонок. Поэтому убедитесь, что ваша среда сборки (особенно если вы используете Windows + Cygwin) работает. Убедитесь, что сборка hello-jni и сборка по умолчанию с двумя библиотеками. Измените второй, и вы должны быть там.

person mchang    schedule 12.12.2011
comment
Большое спасибо! Вы мне очень помогли, сославшись на образец двух библиотек NDK. Но, к сожалению, я могу выбрать только один ответ. - person caw; 16.12.2011