Как я могу использовать комплекс.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.МК (иерархическая структура проекта)?
решена!
прежде всего, я должен был построить свои источники ComplexOperations с цепочкой инструментов, предоставленной Android NDK, поскольку в документации четко указано, что не нужно скомпилировать с компиляторами gnu. Это была моя первая ошибка. Это само по себе еще не решило мою проблему, поскольку я все еще получал комплекс.h не найдена ошибка при выполнении NDK-сборки. Android NDK содержит очень ограниченную реализацию стандартного libc. Чтобы решить эту проблему, я использовал CrystaX NDK расширенный реализация Android NDK. Это все решило!!