Как использовать библиотеку .so только во время компиляции?

У меня есть сторонняя библиотека .so, которую мне нужно использовать во время компиляции только в моем приложении. Поставщик библиотеки говорит: -

NOTE: DO NOT include thelibrary.so as part of agent APK. Use for compilation purpose only.

У меня есть это в моем build.gradle:-

    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
       def ndkDir = project.android.ndkDirectory.absolutePath
       project.logger.debug('my debug message')
       if (ndkDir == null) {
             ndkDir = "/usr/local/bin"
        }
       commandLine "$ndkDir/ndk-build",
            '-C', file('src/main').absolutePath, // Change src/main/jni the relative path to your jni source
            '-j', Runtime.runtime.availableProcessors(),
            'all',
            'NDK_DEBUG=1'
      }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }

и файл Android.mk выглядит так: -

    LOCAL_PATH:= $(call my-dir)
    LOCAL_C_INCLUDES:= $(LOCAL_PATH)
    include $(CLEAR_VARS)
    LOCAL_C_INCLUDES:= $(LOCAL_PATH)
    LOCAL_MODULE:= mymodulename
    LOCAL_STL := c++_static
    LOCAL_CPPFLAGS := -std=c++11
    LOCAL_LDLIBS := -ldl -llog
    LOCAL_LDLIBS += -fuse-ld=bfd
    LOCAL_LDLIBS += -lz
    LOCAL_LDLIBS += -ljnigraphics
    LOCAL_LDLIBS += -landroid
    LOCAL_LDLIBS +:= -Lmylibrary.so <-------THIS IS THE THIRD PARTY LIB
    LOCAL_LDFLAGS:= -Wl,--unresolved-symbols=ignore-all
    LOCAL_SRC_FILES:= mylocalfile_using_thecode_from_so_file.cpp
    include $(BUILD_SHARED_LIBRARY)

Я знаю, что могу добавить myLibrary.so как отдельный модуль и упаковать его как PREBUILT_SHARED_LIBRARY, но поставщик библиотеки сказал, что его не следует упаковывать вместе с apk, а следует использовать только при компиляции.

Как добавить эту библиотеку только для компиляции?

Я не использую cmake. Это унаследованный проект и по какой-то причине нет цели его апгрейдить.


ОБНОВЛЕНИЕ №1

Мы использовали другую версию этой библиотеки в проекте. Давайте назовем его Версия 1 и включим Версия 1 как PREBUILT_SHARED_LIBRARY. Однако, когда я использую более новый Версия 2 той же библиотеки, что и PREBUILT_SHARED_LIBRARY, он жалуется

cannot locate symbol "_ZNK7android8String164sizeEv" referenced by thefinalbuiltlibrary.so .

Что касается игнорирования всех символов LDFLAG: - Это одна из многих вещей, которые я просто пытаюсь заставить работать.

Ммм... Я думаю, вам нужно сказать немного больше о том, что происходит. Зачем вам библиотека? Что произойдет, если вы не поставите его? Вы игнорируете неопределенные символы... Что изменилось, чтобы сделать все это необходимым?

G. Blake Meike 02.05.2019 06:40

@ G.BlakeMeike добавил обновление к вопросу выше.

rasmus 02.05.2019 07:13

Это все еще не имеет особого смысла. _ZNK7android8String164sizeEv — это android::String16`, который не является API NDK. Если это не предусмотрено вашим приложением, вы неправильно загружаете его из системы, и это будет работать только на устройствах pre-N. Если это является, предоставленное вашим приложением, то не имеет значения, с какой библиотекой вы строите, поэтому вы должны просто строить с той, которую вы отправляете.

Dan Albert 20.05.2019 23:39
LOCAL_LDFLAGS:= -Wl,--unresolved-symbols=ignore-all этот флаг просто превращает ошибки сборки в ошибки выполнения. Я бы рекомендовал удалить его.
Dan Albert 20.05.2019 23:40
1
4
211
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

How do I add this library for compilation only?

Вероятно, вы пытаетесь исключить эту общую библиотеку при упаковке apk. Вставив приведенный ниже фрагмент в свой app/build.gradle, вы можете добиться этого:

android { 
    ...
    packagingOptions {
        exclude 'lib/x86/thefinalbuiltlibrary.so'
        exclude 'lib/x86_64/thefinalbuiltlibrary.so'
        exclude 'lib/armeabi-v7a/thefinalbuiltlibrary.so'
        exclude 'lib/arm64-v8a/thefinalbuiltlibrary.so'
    }
    ...
}

См.: Файлы libsupportjni.so добавлены в проект

Другие вопросы по теме