Как создать внешнюю библиотеку c ++ (статическую или общую) для Android?

0

Как создать внешнюю библиотеку 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 &lt= 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'
Теги:
static
android-ndk
jni

1 ответ

0

вы используете LOCAL_SRC_FILES := libStaticLibraryTest.a для объявления вашей предварительно созданной статической библиотеки. Это означает, что этот.a файл будет использоваться при компиляции для всех архитектур, поддерживаемых NDK, но это не сработает, поскольку для каждой архитектуры вам нужно иметь другую.

Вы должны скомпилировать ваш.a для всех поддерживаемых архитектур и поместить его под вложенными папками (armeabi-v7a, x86, arm64-v8a, x86_64...), чтобы вы могли включить его правильно, используя что-то вроде этого:

LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libStaticLibraryTest.a

Ещё вопросы

Сообщество Overcoder
Наверх
Меню