Как создать внешнюю библиотеку c++ (статический или общий) для Android?
Здравствуй,
В настоящее время я пытаюсь использовать JNI для вызова библиотеки c++ из моего приложения для Android. Простой пример, в котором я только что реализовал файлы c++, созданные jni напрямую, отлично работает.
Теперь я хочу создать внешнюю библиотеку c++ и вызвать ее в реализации jni c++. Таким образом, реализация jni определяет интерфейс, и вся функциональность находится во внешней статической библиотеке c++.
Для этого я создаю проект c++ с использованием eclipse (ubuntu 32bit).
Структура проекта выглядит следующим образом:
StaticLibraryTest
-> src
-> bean -> Point
-> util -> Math
-> StringUtil
Проект просто реализует простые методы тестирования.
Теперь у меня возникает вопрос: как построить этот проект, чтобы я мог использовать его в реализации jni c++. У меня возникли проблемы с выполнением ndk-build.
Моя папка jni выглядит так:
NativeTestProject
-> jni
-> calc -> de_tl_calc_SharedLibraryInterface.h
-> de_tl_calc_SharedLibraryInterface.cpp
-> inc
-> **/*.h(all header files from the external StaticLibraryTest library)
-> libStaticLibraryTest.a (my external library)
-> Application.mk (just containing the line: APP_ABI := all)
-> Android.mk
Android.mk содержит следующие строки:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libStaticLibraryTest
LOCAL_SRC_FILES := libStaticLibraryTest.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc
LOCAL_SRC_FILES := calc/de_tl_calc_SharedLibraryInterface.cpp
LOCAL_MODULE := de_tl_calc_SharedLibraryInterface
LOCAL_STATIC_LIBRARIES := libStaticLibraryTest
include $(BUILD_SHARED_LIBRARY)
Я был бы очень рад, если кто-нибудь сможет помочь мне найти правильный путь.
Редактировать:
Думаю, я сделал следующий шаг. Я создал внешнюю статическую библиотеку с arm-linux-gnueabi, и теперь я получил следующую ошибку: ndk-build:
$ ndk-build
[arm64-v8a] Compile++ : de_tl_calc_SharedLibraryInterface <= de_tl_calc_SharedLibraryInterface.cpp
[arm64-v8a] SharedLibrary : libde_tl_calc_SharedLibraryInterface.so
collect2.exe: error: ld returned 5 exit status
/cygdrive/k/android-ndk64-r10-windows-x86_64/build/core/build-binary.mk:647: recipe for target 'obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so' failed
make: *** [obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so] Error 1
make: *** Deleting file 'obj/local/arm64-v8a/libde_tl_calc_SharedLibraryInterface.so'
вы используете LOCAL_SRC_FILES := libStaticLibraryTest.a
для объявления вашей предварительно созданной статической библиотеки. Это означает, что этот.a файл будет использоваться при компиляции для всех архитектур, поддерживаемых NDK, но это не сработает, поскольку для каждой архитектуры вам нужно иметь другую.
Вы должны скомпилировать ваш.a для всех поддерживаемых архитектур и поместить его под вложенными папками (armeabi-v7a, x86, arm64-v8a, x86_64...), чтобы вы могли включить его правильно, используя что-то вроде этого:
LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libStaticLibraryTest.a