Как я могу использовать комплекс.h для Android NDK?

у меня есть собственный исходный код, написанный на C, который я хотел бы запустить на своем устройстве Android (Nexus 7). Я уже успешно сделал много исследований и онлайн-уроки по запуску собственного кода на Android с помощью Android NDK. Я кое-что узнал об этом. Однако код, который у меня есть, использует сложные функции стандартной математической библиотеки, определенные в комплексе.h. Однако библиотека NDK C, похоже, не поддерживает сложные функции. Всякий раз, когда я делаю ndk-строить на проект я получаю:

fatal error: complex.h: no such file or directory.

в качестве решения я думал о получении стандартной математической библиотеки (libm.a) из arm-linux-gnueabi и связать его с моим родным источником. Вот мой Андроид.МК:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := StandardC
LOCAL_SRC_FILES := libc.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := mathLib
LOCAL_SRC_FILES := libm.a
LOCAL_STATIC_LIBRARIES := StandardC
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ComplexOperations
LOCAL_SRC_FILES := libComplexOperations.a
LOCAL_STATIC_LIBRARIES := mathLib
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := MySource
LOCAL_CFLAGS += -std=c99
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
LOCAL_STATIC_LIBRARIES := ComplexOperations
include $(BUILD_SHARED_LIBRARY)

мне пришлось связать libc arm-linux-gnueabi-gcc, а также libm. Модуль "ComplexOperations" был статически скомпилирован с использованием arm-linux-gnueabi-gcc с флагами компилятора-march=armv7-a. Эта библиотека использует комплекс.ч. Это строит без каких-либо ошибок и предупреждение. Но когда я запускаю приложение и вызываю

System.loadLibrary("MySource");

Я получаю эту ошибку на logcat:

E/dalvikvm( 3932): dlopen("/data/app-lib/com.samuel.test-1/libMySource.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol ".LANCHOR2" referenced by "libMySource.so"...

при этой ошибке создается исключение UnsatisfiedLinkError, которое приводит к сбою приложения, если оно не обрабатывается.

может кто-нибудь PLEAASEE помочь мне!! Я уже несколько дней пытаюсь разобраться в этом сама!! :(

4 ответов


начиная с Android-L (ollipop) NDK теперь предоставляет комплекс.заголовок сек.

загрузите последнюю версию NDK из https://developer.android.com/tools/sdk/ndk/index.html и сложный.h можно найти в /platforms/android-L/arch-arm/usr/include.


я добавил следующую строку Android.mk, что, похоже, исправило проблему.

LOCAL_C_INCLUDES += C:\Users\Sami\workspace\android-ndk-r8e\sources\cxx-stl\gnu-libstdc++.7\include\

не уверен, какая переменная заменит C:\Users\Sami\workspace\ часть, так что если кто-нибудь знает, пожалуйста сообщите.


изменить: На самом деле, это только удалило ошибку по какой-то причине, но это не исправило проблему из того, что я заметил. На этой ноте, C:\Users\Sami\workspace\android-ndk-r8e можно было заменить $(NDK_ROOT).

я попробовал NDK Crystax, но я продолжал получать complex.h не найден ошибка. Все, что я делал, это просто копировал комплекс.h и MinGW.h в мой каталог jni. Все работало, и код был протестирован как на x86, так и на эмуляторе ARM.


кажется, что ваш путь сломан. Пожалуйста, обратитесь к следующим сообщениям, чтобы решить эту проблему.

Android NDK: как включить Android.mk в другой Android.МК (иерархическая структура проекта)?

ошибка android ndk "нет такого файла или каталога"?


решена!

прежде всего, я должен был построить свои источники ComplexOperations с цепочкой инструментов, предоставленной Android NDK, поскольку в документации четко указано, что не нужно скомпилировать с компиляторами gnu. Это была моя первая ошибка. Это само по себе еще не решило мою проблему, поскольку я все еще получал комплекс.h не найдена ошибка при выполнении NDK-сборки. Android NDK содержит очень ограниченную реализацию стандартного libc. Чтобы решить эту проблему, я использовал CrystaX NDK расширенный реализация Android NDK. Это все решило!!