Я пытаюсь получить доступ к функциям gnuradio в Android, в частности к функции полосового фильтра. Без вызова каких-либо функций, ndk-build компилирует код. Когда я вызываю функцию complex_band_pass (…), она выдает ошибку неопределенной ссылки на:
Ошибка из ndk-build:
ошибка: неопределенная ссылка на ‘gr_firdes :: complex_band_pass (double, double, double, double, double, gr_firdes :: win_type, double)’
collect2: ld вернул 1 статус выхода
в моем файле Android.mk для этого конкретного файла:
include $(CLEAR_VARS)
LOCAL_MODULE := rxfilter
LOCAL_SRC_FILES := src/rx_filter.cpp
LOCAL_C_INCLUDES += /usr/local/include/gnuradio \
/usr/local/include \
${ANDROID_NDK_ROOT}/sources/cxx-stl/stlport/stlport
LOCAL_CFLAGS := -DANDROID -DUSE_LIBLOG
LOCAL_SHARED_LIBRARIES += rtlsdr
LOCAL_STATIC_LIBRARIES := /usr/local/lib/libgnuradio #doesn't seem to help
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
в моем файле rx_filter.cpp:
#include <jni.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <gr_firdes.h>
using namespace std;
static void attemptToAccessGnuRadio()
{
// gr_firdes is a class
gr_firdes gg;
// compiles without this line
gg.complex_band_pass(1.0, 24000.0, 100.0, 500.0, 1.0);
}
#ifdef __cplusplus
extern "C" {
#endifJNIEXPORT jint JNICALL Java_rtlsdr_MainActivity_nativeRtlSdrFm(JNIEnv *envp, jobject objp)
{
return 1;
}
#ifdef __cplusplus
}
#endif
Примечание: gnuradio был установлен в папку по умолчанию
Что я могу сделать, чтобы получить доступ к функциям gnuradio в Android?
Альтернативный вопрос: как создать полосовой фильтр в среде Android NDK?
Заранее спасибо, тем временем я буду устранять неисправности самостоятельно, как и в течение последних нескольких дней. Если я найду решение, я опубликую его.
Сначала вы можете проверить, что функция-член уже
nm libgnuradio.a | grep gr_firdes::complex_band_pass
или же
nm libgnuradio.a | grep complex_band_pass
а также
Добавляет
LOCAL_LDFLAGS := -L/usr/local/lib
LOCAL_LDLIBS += -llog -lgnuradio
Если вы отлаживаете полный журнал сборки, то
build V=1 will be helpful or use VERBOSE=1
gr_firdes::complex_band_pass(double, double, double, double, double, gr_firdes::win_type, double)
должен быть в libgnuradio-filter.a
Вы можете проверить через nm
как упоминалось в одном из других ответов c++filt
может помочь разобрать имена функций. Например:
$ nm libgnuradio-filter.a | c++filt | grep complex_band
000024c8 T gr::filter::firdes::complex_band_pass(double, double, double, double, double, gr::filter::firdes::win_type, double)
Ваша ошибка должна быть решена, убедившись, что ваш LOCAL_LDLIBS
включает в себя -lgnuradio-filter